如何在应用系统中加入安装界面

如果您是使用Microstation中的MDL来开发应用系统,那么加入安装界面将会使人对您的应用程序具有深刻的第一印象。这一篇文章就是叙述通过各种MDL应用程序的连结来建立安装界面资料库界面;此应用程序大致上可以使用任何的bitmap影像,同时设定也相当容易。&nbsp
在这项目中,有一些基本的设计参数。在图形中几乎任何形式的bitmap影像均可以使用,虽然影像的大小与内容都是考虑的重点,但这并不在这篇文章的讨论范围内,故不在此作探讨。程序之中不应将特定的影像档档名写入程序码中,以免以后无法改变所设定影像档;要注意控制好安装界面显示时间的长短;最后要考虑的一点是当安装界面是INITAPP内之一个设定值时,尽可能让安装界面能显现。&nbsp
我已经利用这些规则来建立了一个MDL应用程序来显示安装界面,这篇文章中引用它来说明项目,程序码会在转载於此以供参考,亦可在MSM&nbspOnline&nbspCode&nbspArchive&nbsp中下载。&nbsp
表1&nbsp原始档splash.r中的程序码&nbsp
/*********************************************************************&nbsp
*&nbspCopyright&nbsp(&nbsp1998&nbsp &nbsp2001&nbsp)&nbspBentley&nbspSystems,&nbspInc.,&nbspAll&nbsprights&nbspreserved.&nbsp
*&nbsp
*&nbsp
*&nbspDescription:&nbsp
*&nbsp
*&nbsp
*&nbspModifications:&nbsp
*=========================================================&nbsp
*&nbsp
*&nbsp
********************************************************************/&nbsp
/*———————————————————————-+&nbsp
|&nbsp|&nbsp
|&nbspInclude&nbspFiles&nbsp|&nbsp
|&nbsp|&nbsp
+———————————————————————-*/&nbsp
#&nbspinclude&nbsp<&nbsprscdefs.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspcmdclass.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspdlogbox.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspdlogids.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspkeys.h&nbsp>&nbsp
#&nbspinclude&nbsp"&nbspsplash.ids&nbsp"&nbsp
/*———————————————————————-+&nbsp
|&nbsp|&nbsp
|&nbsp对话方块&nbsp|&nbsp
|&nbsp|&nbsp
+———————————————————————-*/&nbsp
DialogBoxRsc&nbspDIALOGID_Splash&nbsp=&nbsp
{&nbsp
DIALOGATTR_NORIGHTICONS&nbsp|&nbsp
DIALOGATTR_REQUESTBACKINGSTORE&nbsp|&nbsp
DIALOGATTR_MUSTSTAYVISIBLE&nbsp|&nbsp
DIALOGATTR_UNMOVEABLE&nbsp|&nbsp
DIALOGATTR_THINBORDERS&nbsp|&nbsp
DIALOGATTR_UNCLOSEABLE,&nbsp
0,&nbsp0,&nbsp
NOHELP,&nbspMHELP,&nbsp
NOHOOK,&nbsp
NOPARENTID,&nbsp
"",&nbsp
{&nbsp
{{&nbsp0,&nbsp0,&nbsp0,&nbsp0&nbsp},&nbspGeneric,&nbspGENERICID_SplashFrame,&nbspON,&nbsp0,&nbsp"",&nbsp""},&nbsp
}&nbsp
};&nbsp
/*———————————————————————-+&nbsp
|&nbsp|&nbsp
|&nbsp实体项目&nbsp|&nbsp
|&nbsp|&nbsp
+———————————————————————-*/&nbsp
/*———————————————————————-+&nbsp
|&nbsp|&nbsp
|&nbsp一般的资源项目&nbsp|&nbsp
|&nbsp|&nbsp
+———————————————————————-*/&nbsp
DItem_GenericRsc&nbspGENERICID_SplashFrame&nbsp=&nbsp
{&nbsp
NOHELP,&nbsp
MHELP,&nbsp
HOOKID_GenericItem,&nbsp
NOARG&nbsp
};&nbsp
表2&nbsp独立部分的原始档&nbspsplash.ids&nbsp程序码&nbsp
/*********************************************************************&nbsp
*&nbspCopyright&nbsp(&nbsp1998&nbsp &nbsp2001&nbsp)&nbspBentley&nbspSystems,&nbspInc.,&nbspAll&nbsprights&nbspreserved.&nbsp
*&nbsp
*&nbsp
*&nbspDescription:&nbsp
*&nbsp
*&nbsp
*&nbspModifications:&nbsp
*==========================================================&nbsp
*&nbsp
********************************************************************/&nbsp
#&nbspif&nbsp!&nbspdefined&nbsp(&nbsp__splashidsH__&nbsp)&nbsp
#&nbspdefine&nbsp__splashidsH__&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp定义&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp资源&nbspID's&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp对话框&nbspID's&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
#&nbspdefine&nbspDIALOGID_Splash&nbsp1000&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp一般项目&nbspID's&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
#&nbspdefine&nbspGENERICID_SplashFrame&nbsp1&nbsp
#&nbspendif&nbsp/*&nbsp!defined&nbsp(&nbsp__splashidsH__&nbsp)&nbsp*/&nbsp
在建立资源的档案中将会产生给这些对话框的资源库(表3),而这个建立的档案将被包含在以下的splash.mke档案之中(参表5)。请注意资源库将不会与任何的物件档案相连结,而连结的部分将由(splash.rl)这个档案在稍後有片段的说明。&nbsp
表3&nbsp
包含资源建立的档案splashRsc.mki&nbsp
 &nbsp
#———————————————————————-&nbsp
#&nbspCopyright&nbsp1996&nbsp-&nbsp2000,&nbspBentley&nbspSystems,&nbspInc.&nbsp
#&nbsp
#&nbsp这边所授与的最高权限仅限於复制及修正版权资料,而这项版权&nbsp
#&nbsp资料规定所提供的程序码仅能与Bentley所提供的相关产品中使&nbsp
#&nbsp用。此外需注意有关版权资料在任何的复制或修正下,也应该保持&nbsp
#&nbsp程序完整性。&nbsp
#———————————————————————-&nbsp
rlRscs&nbsp=&nbsp$(o)&nbsp$(&nbspappName&nbsp).rsc&nbsp
#———————————————————————-&nbsp
#&nbsp以下的部分是建立给应用系统的任何转换资源的模组&nbsp
#———————————————————————-&nbsp
$(o)&nbsp$(&nbspsAppName&nbsp).rsc&nbsp:&nbsp$(&nbspbaseDir&nbsp)&nbsp$(&nbspappName&nbsp).r&nbsp\&nbsp
$(&nbspprivateInc&nbsp)&nbsp$(&nbspappName&nbsp).ids&nbsp
#———————————————————————-&nbsp
#&nbsp共用对话框资源的使用&nbsp
#———————————————————————-&nbsp
$(&nbspLibraryOut&nbsp)&nbsp$(&nbspsAppName&nbsp).rl&nbsp:&nbsp$(&nbsprlRscs&nbsp)&nbsp
$(&nbspmsg&nbsp)&nbsp
>&nbsp$(o)make.opt&nbsp
-o$@&nbsp
$(&nbsprlRscs&nbsp)&nbsp
<&nbsp
$(&nbsprscLibCmd&nbsp)&nbsp@&nbsp$(o)make.opt&nbsp
~time&nbsp
#&nbsp建立结束。注意:空白行再对於结束最后的规则时是相当有用的,&nbsp
#&nbsp因为这可以防止与其他的’.mki’档案连结,源自Foreign&nbspLanguage&nbsp
#&nbspTranslation&nbspKit的规范。&nbsp
建立资源库界面&nbsp
资源库界面是由一个MDL物件与一个资源库物件所组成的,而这些均需连结至你所建立的应用程序,我建立了一个简单的MDL应用程序来说明如何完成这些设定。&nbsp
安装界面对话方块是在splash.r中定义(参考表1)。这只是关於对话中的一般对话项目来提供bitmap影像。当阅读程序码之时,请注意有许多对话框属性已经有定义了,因为这些定义,所以安装界面的边框可以隐藏起来,并在必要时将它贴上,同时防止当安装界面显示时,&nbsp使用者试图控制或修改安装界面的大小。此外也须注意这些对话方块与其所产生的安装界面并没有绝对的座标位置与相关大小,它们会随著所载入影像的大小而作缩放,这些对话方块在这资源中是独立的并在splash.ids(表2)中做定义。&nbsp
建立资源库界面&nbsp
下一步所要探讨的是原始码(表4)。所有的操作都是在这里处理。首先来看看显示安装界面界面的公用程序splash_displaySplashWindow,这个界面所需注意的只有时间这一个参数,显示安装界面是以秒为单位,因为这个参数没有任何的检测,所以依照个人需求,适当的设定时间参数。以下的例子是以现有的界面来显示安装界面。首先,一个叫splash_getBMPImageData会抓取点阵影像并将其读进记忆体之中,影像的名称会储存於参数设定档中的变数SPLASH_BMP之中。为了能够使用各种格式的格点影像,利用第四的参数值IMAGEFILE_INKNOWN回传给标准MDL界面mdlImage_readFileToRGB,当参数值回传後,界面即会读进影像的格式来做计算,所以当影像被载入记忆体中,程序即可减少处理有关各类影像的转换的事情。在顺利地取得影像并存入记忆体之后,程序就会重新调整对话项目及对话框的大小以配合影像,执行这些工作的是splash_resizeDialogForBMP。当对话框调整之后,这就做好要显示的准备了。再来就是依照公用界面中所设定的时间以暂停MicroStation数秒钟。&nbsp
表4&nbsp
原始码splash.mc&nbsp
/********************************************************************&nbsp
*&nbspCopyright&nbsp(&nbsp1998&nbsp &nbsp2001&nbsp)&nbspBentley&nbspSystems,&nbspInc.,&nbspAll&nbsprights&nbspreserved.&nbsp
*&nbsp
*&nbspDescription:&nbsp
*&nbsp
*&nbspModifications:&nbsp
********************************************************************/&nbsp
/*&nbspStandard&nbspMicrostation&nbspinclude&nbspfiles&nbsp*/&nbsp
#&nbspinclude&nbsp<&nbspmdl.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspmsdefs.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspbasetype.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspglobal.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspdlogitem.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspimage.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspstdlib.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspstring.h&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspstdio.h&nbsp>&nbsp
/*&nbspFunction&nbspdefinition&nbspfiles&nbsp*/&nbsp
#&nbspinclude&nbsp<&nbspmssystem.fdf&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspmsdialog.fdf&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspmswindow.fdf&nbsp>&nbsp
#&nbspinclude&nbsp<&nbspmsimage.fdf&nbsp>&nbsp
/*&nbsp特定的表头档案&nbsp*/&nbsp
#&nbspinclude&nbsp"splash.h"&nbsp
#&nbspinclude&nbsp"splash.fdf"&nbsp
#&nbspinclude&nbsp"splash.ids"&nbsp
/*———————————————————————-+&nbsp
|&nbsp
|&nbsp本机定义&nbsp
|&nbsp
+———————————————————————-*/&nbsp
Point2d&nbsprgbImageSize;&nbsp
BSIRect&nbspbmpRectangle;&nbsp
char&nbsp*imageBuffer&nbsp= NULL;&nbsp
DialogBox&nbsp*splashDbP&nbsp= NULL;&nbsp
/*———————————————————————-+&nbsp
|&nbsp
|&nbsp外部变数&nbsp
|&nbsp
+———————————————————————-*/&nbsp
/*==========================================================+&nbsp
|&nbsp
|&nbsp公用程序的内部演算&nbsp
|&nbsp
+==========================================================*/&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_getBmpName&nbsp
||&nbsp
|&nbsp目的:由设定参数回传显示影像的名称&nbsp
+———————————————————————-*/&nbsp
Private&nbspchar&nbsp*splash_getBmpName&nbsp
(&nbsp
void&nbsp
)&nbsp
{&nbsp
//&nbspget&nbspbmp&nbspname&nbspfrom&nbspCfgVar&nbsp
return&nbsp(&nbspmdlSystem_getExpandedCfgVar&nbsp(&nbspTXT_SPLASH_BMP&nbsp));&nbsp
}&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_getDialogFontInfo&nbsp|&nbsp
||&nbsp
|&nbsp目的:由对话方块与影像的大小来计算对话文字的大小&nbsp|&nbsp
+———————————————————————-*/&nbsp
Private&nbspvoid&nbspsplash_getDialogFontInfo&nbsp
(&nbsp
DialogBox&nbsp*dP,&nbsp
int&nbsp*fWidth,&nbsp
int&nbsp*fHeight,&nbsp
double&nbsp*hFactor&nbsp
)&nbsp
{&nbsp
mdlDialog_fontGetInfo&nbsp(&nbspNULL,&nbspfWidth,&nbspNULL,&nbsp
fHeight,&nbspdP,&nbsp
mdlDialog_fontIndexGet&nbsp(&nbspdP&nbsp));&nbsp
/*&nbspThe&nbspheight&nbspfactor&nbspfor&nbspthe&nbspdialog&nbspis&nbsp12&nbsptimes&nbspthe&nbspfont&nbspheight&nbsp*/&nbsp
if&nbsp(&nbsphFactor&nbsp)&nbsp
*hFactor&nbsp=&nbsp12.0&nbsp/&nbsp(&nbspdouble&nbsp)(&nbsp*fHeight&nbsp);&nbsp
}&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_getSextentFromRectangle&nbsp|&nbsp
||&nbsp
|&nbsp目的:设定项目的范围为有关对话框内的字体&nbsp|&nbsp
|&nbsp与影像的相关项目&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
Private&nbspvoid&nbspsplash_getSextentFromRectangle&nbsp
(&nbsp
Sextent&nbsp*extent,&nbsp
DialogBox&nbsp*dP,&nbsp
BSIRect&nbsp*rectP&nbsp
)&nbsp
{&nbsp
double&nbsphFactor;&nbsp
int&nbspfHeight;&nbsp
splash_getDialogFontInfo&nbsp(&nbspdP,&nbspNULL,&nbsp&fHeight,&nbsp&hFactor&nbsp);&nbsp
extent&nbsp->&nbsporigin.x&nbsp=&nbsp(&nbspdouble&nbsp)&nbsprectP&nbsp->&nbsporigin.x&nbsp*&nbsphFactor;&nbsp
extent&nbsp->&nbsporigin.y&nbsp=&nbsp(&nbspdouble&nbsp)&nbsprectP&nbsp->&nbsporigin.y&nbsp*&nbsphFactor;&nbsp
extent&nbsp->&nbspwidth&nbsp=&nbsp(&nbspdouble&nbsp)&nbsp(&nbsprectP&nbsp->&nbspcorner.x&nbsp-&nbsprectP->origin.x&nbsp)&nbsp*&nbsphFactor;&nbsp
extent&nbsp->&nbspheight&nbsp=&nbsp(&nbspdouble&nbsp)&nbsp(&nbsprectP&nbsp->&nbspcorner.y&nbsp-&nbsprectP&nbsp->&nbsporigin.y&nbsp)&nbsp*&nbsphFactor;&nbsp
}&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_resizePhotoGenericItem&nbsp|&nbsp
||&nbsp
|&nbsp目的:重新调整对话方块中的项目以配合影像大小&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
Private&nbspvoid&nbspsplash_resizePhotoGenericItem&nbsp
(&nbsp
DialogBox&nbsp*dP,&nbsp
BSIRect&nbsp*rectP,&nbsp
Point2d&nbsp*imageSize,&nbsp
int&nbspfWidth&nbsp
)&nbsp
{&nbsp
DialogItem&nbsp*itemP&nbsp=&nbsp0x0;&nbsp
Sextent&nbspextent;&nbsp
Point2d&nbspnewPos;&nbsp
int&nbspindex;&nbsp
itemP&nbsp=&nbspmdlDialog_itemGetByTypeAndId&nbsp(&nbspdP,&nbspRTYPE_Generic,&nbsp
GENERICID_SplashFrame,&nbsp0&nbsp);&nbsp
rectP&nbsp->&nbsporigin.y&nbsp=&nbspitemP&nbsp->&nbsprect.origin.y;&nbsp
rectP&nbsp->&nbsporigin.x&nbsp=&nbspitemP&nbsp->&nbsprect.origin.x;&nbsp
rectP&nbsp->&nbspcorner.x&nbsp=&nbsprectP&nbsp->&nbsporigin.x&nbsp+&nbspimageSize&nbsp->&nbspx&nbsp-&nbsp(&nbsp2*XC&nbsp);&nbsp
rectP&nbsp->&nbspcorner.y&nbsp=&nbsprectP&nbsp->&nbsporigin.y&nbsp+&nbspimageSize&nbsp->&nbspy&nbsp-&nbsp(&nbspYC/2&nbsp);&nbsp
splash_getSextentFromRectangle&nbsp(&nbsp&extent,&nbspdP,&nbsprectP&nbsp);&nbsp
mdlDialog_itemSetExtent&nbsp(&nbspdP,&nbspitemP&nbsp->&nbspitemIndex,&nbsp&extent,&nbspFALSE&nbsp);&nbsp
}&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_resizeDialogForBMP&nbsp|&nbsp
||&nbsp
|&nbsp目的:重新调整对话框以配合影像大小&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
Private&nbspvoid&nbspsplash_resizeDialogForBMP&nbsp
(&nbsp
DialogBox&nbsp*dP,&nbsp
BSIRect&nbsp*rectP,&nbsp
Point2d&nbsp*imageSize&nbsp
)&nbsp
{&nbsp
DialogItem&nbsp*itemP&nbsp=&nbsp0&nbspx&nbsp0;&nbsp
MSDisplayDescr&nbsp*displayDescrP&nbsp= NULL;&nbsp
Point2d&nbspnewPos;&nbsp
Rectangle rect;&nbsp
int&nbspfWidth,&nbsp
fHeight;&nbsp
mdlDialog_fontGetInfo&nbsp(&nbspNULL,&nbsp&fWidth,&nbspNULL,&nbsp&fHeight,&nbspdP,&nbsp
mdlDialog_fontIndexGet&nbsp(&nbspdP&nbsp));&nbsp
splash_resizePhotoGenericItem&nbsp(&nbspdP,&nbsprectP,&nbspimageSize,&nbspfWidth&nbsp);&nbsp
itemP&nbsp=&nbspmdlDialog_itemGetByTypeAndId&nbsp(&nbspdP,&nbspRTYPE_Generic,&nbsp
GENERICID_SplashFrame,&nbsp0&nbsp);&nbsp
if&nbsp(&nbsp!itemP&nbsp)&nbsp
return&nbsp
newPos.y&nbsp=&nbsp(&nbspitemP&nbsp->&nbsprect.corner.y&nbsp>&nbsprectP&nbsp->&nbspcorner.y&nbsp)&nbsp?&nbsp
itemP&nbsp->&nbsprect.corner.y&nbsp:&nbsprectP&nbsp->&nbspcorner.y;&nbsp
newPos.y&nbsp+=&nbsp(&nbspfHeight&nbsp/&nbsp2&nbsp);&nbsp
newPos.x&nbsp=&nbsprectP&nbsp->&nbspcorner.x&nbsp+&nbspfWidth;&nbsp
mdlWindow_pointToGlobal&nbsp(&nbsp&newPos,&nbspdP,&nbsp&newPos&nbsp);&nbsp
mdlWindow_resize&nbsp(&nbspdP,&nbspCORNER_LOWERRIGHT,&nbsp&newPos&nbsp);&nbsp
displayDescrP&nbsp=&nbspmdlWindow_displayDescrGet&nbsp(&nbspdP&nbsp);&nbsp
if&nbsp(&nbspdisplayDescrP&nbsp)&nbsp
{&nbsp
Point2d&nbspupperLeftPos;&nbsp
BSIRect&nbspwindowRect;&nbsp
mdlWindow_globalRectGetGlobal&nbsp(&nbsp&windowRect,&nbspdP&nbsp);&nbsp
upperLeftPos.x&nbsp=&nbsp((&nbspdisplayDescrP&nbsp->&nbspscreenRect.corner.x&nbsp-&nbsp
displayDescrP&nbsp->&nbspscreenRect.origin.x&nbsp)&nbsp-&nbsp
(&nbspwindowRect.corner.x&nbsp-&nbspwindowRect.origin.x&nbsp))&nbsp/ 2;&nbsp
upperLeftPos.y&nbsp=&nbsp((&nbspdisplayDescrP&nbsp->&nbspscreenRect.corner.y&nbsp-&nbsp
displayDescrP&nbsp->&nbspscreenRect.origin.y)&nbsp-&nbsp
(&nbspwindowRect.corner.y&nbsp-&nbspwindowRect.origin.y&nbsp))&nbsp/ 2;&nbsp
mdlWindow_resize&nbsp(&nbspdP,&nbspCORNER_ALL,&nbsp&upperLeftPos&nbsp);&nbsp
}&nbsp
}&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_displayBMPData&nbsp|&nbsp
||&nbsp
|&nbsp目的:&nbsp将RGB&nbsp影像置入对话框中&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
Private&nbspvoid&nbspsplash_displayBMPData&nbsp
(&nbsp
DialogBox&nbsp*dP,&nbsp
BSIRect&nbsp*rectP,&nbsp
Point2d&nbsp*imageSize&nbsp
)&nbsp
{&nbsp
BSIRect rect;&nbsp
if&nbsp(&nbsp!dP&nbsp)&nbsp
return;&nbsp
memcpy&nbsp(&nbsp&rect,&nbsprectP,&nbspsizeof&nbsp(&nbspBSIRect&nbsp));&nbsp
rect.origin.x&nbsp+= 1;&nbsp
rect.origin.y&nbsp+= 1;&nbsp
rect.corner.x&nbsp=&nbsprect.origin.x&nbsp+&nbsprgbImageSize.x&nbsp- 1;&nbsp
rect.corner.y&nbsp=&nbsprect.origin.y&nbsp+&nbsprgbImageSize.y&nbsp- 1;&nbsp
rectP&nbsp->&nbspcorner.x&nbsp=&nbsprect.corner.x;&nbsp
rectP&nbsp->&nbspcorner.y&nbsp=&nbsprect.corner.y;&nbsp
mdlWindow_rgbDataDraw&nbsp(&nbspdP,&nbsp&rect,&nbsp0,&nbspimageBuffer,&nbsp0,&nbsp0,&nbspNULL&nbsp);&nbsp
mdlDialog_rectDrawBeveled&nbsp(&nbspdP,&nbsprectP,&nbspTRUE,&nbspTRUE&nbsp);&nbsp
}&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_getBMPImageData&nbsp|&nbsp
||&nbsp
|&nbsp目的:将获得的影像以RGB格式处理,&nbsp|&nbsp
|&nbsp所以可以在一般的对话项目中显示。&nbsp|&nbsp
||&nbsp
+———————————————————————-*/&nbsp
Private&nbspint&nbspsplash_getBMPImageData&nbsp
(&nbsp
void&nbsp
)&nbsp
{&nbsp
int&nbspfileType;&nbsp
char&nbsp*fileNameP&nbsp= NULL;&nbsp
int&nbspiStatus&nbsp=&nbspERROR;&nbsp
char&nbspalert&nbsp[&nbspMAXFILELENGTH&nbsp];&nbsp
if&nbsp(&nbspimageBuffer&nbsp!=&nbspNULL&nbsp)&nbsp
{&nbsp
free&nbsp(&nbspimageBuffer&nbsp);&nbsp
imageBuffer&nbsp= NULL;&nbsp
}&nbsp
fileNameP&nbsp=&nbspsplash_getBmpName&nbsp(&nbsp);&nbsp
if&nbsp(&nbspfileNameP&nbsp!=&nbspNULL&nbsp)&nbsp
{&nbsp
if&nbsp((&nbspStatus&nbsp=&nbspmdlImage_readFileToRGB&nbsp(&imageBuffer,&nbsp&rgbImageSize,&nbsp
fileNameP,&nbspIMAGEFILE_UNKNOWN,&nbsp
NULL,&nbspNULL&nbsp))&nbsp!=&nbspSUCCESS&nbsp)&nbsp
{&nbsp
sprintf&nbsp(&nbspalert,&nbsp"Error&nbsp%d&nbsp:&nbspUnable&nbspto&nbspconvert&nbspor&nbspretrieve&nbspImage&nbsp:&nbsp(&nbsp%s&nbsp)",&nbspiStatus,&nbspfileNameP&nbsp);&nbsp
mdlDialog_openAlert&nbsp(&nbspalert&nbsp);&nbsp
}&nbsp
}&nbsp
if&nbsp(&nbspfileNameP&nbsp)&nbsp
free&nbsp(&nbspfileNameP&nbsp);&nbsp
return&nbspiStatus;&nbsp
}&nbsp
/*==========================================================+&nbsp
||&nbsp
|&nbsp主要的公用程序部分&nbsp|&nbsp
||&nbsp
+==========================================================*/&nbsp
/*———————————————————————-+&nbsp
||&nbsp
|&nbsp名称:splash_displaySplashWindow&nbsp|&nbsp
|||&nbsp
+———————————————————————-*/&nbsp
Public&nbspvoid&nbspsplash_displaySplashWindow&nbsp
(&nbsp
int&nbspseconds&nbsp/*&nbspTime&nbspthe&nbspdialog&nbspis&nbspopen&nbsp*/&nbsp
)&nbsp
{&nbsp
if&nbsp(&nbspmdlDialog_find&nbsp(&nbspDIALOGID_Splash,&nbspNULL&nbsp)&nbsp==&nbspNULL&nbsp)&nbsp
{&nbsp
/*&nbsp获取所需的影像资料&nbsp*/&nbsp
if&nbsp(&nbspSUCCESS&nbsp==&nbspsplash_getBMPImageData&nbsp(&nbsp))&nbsp
{&nbsp
/*&nbsp开启对话框来抓取影像&nbsp*/&nbsp
splashDbP&nbsp=&nbspmdlDialog_open&nbsp(&nbspNULL,&nbspDIALOGID_Splash&nbsp);&nbsp
/*&nbsp隐藏对话框直到其大小符合影像为止&nbsp*/&nbsp
mdlWindow_hide&nbsp(&nbspsplashDbP,&nbspFALSE,&nbspTRUE&nbsp);&nbsp
/*&nbsp调整对话内容&nbsp*/&nbsp
splash_resizeDialogForBMP&nbsp(&nbspsplashDbP,&nbsp&bmpRectangle,&nbsp&rgbImageSize&nbsp);&nbsp
/*&nbsp对话内容&nbsp*/&nbsp
mdlWindow_show&nbsp(&nbspsplashDbP,&nbspTRUE&nbsp);&nbsp
/*&nbsp将影像贴入对话方块中的一般项目&nbsp*/&nbsp
splash_displayBMPData&nbsp(&nbspsplashDbP,&nbsp&bmpRectangle,&nbsp&rgbImageSize&nbsp);&nbsp
/*&nbsp等待应用系统定义所需时间&nbsp*/&nbsp
mdlSystem_pauseTicks&nbsp(&nbsp60&nbsp*&nbspseconds&nbsp);&nbsp
/*&nbsp关闭对话方块然后继续应用程序&nbsp*/&nbsp
mdlWindow_close&nbsp(&nbspsplashDbP,&nbspFALSE,&nbspTRUE&nbsp);&nbsp
}&nbsp
}&nbsp
}&nbsp
表5&nbsp
建立档案splash.mke&nbsp
#———————————————————————-&nbsp
#&nbsp
#&nbspCurrent&nbspRevision:&nbsp
#&nbspCopyright&nbsp1996,&nbspBentley&nbspSystems,&nbspInc.&nbsp
#&nbsp
#&nbsp这边所授与的最高权限仅限於复制及修正版权资料,而这项版权&nbsp
#&nbsp资料规定所提供的程序码仅能与Bentley所提供的相关产品中使&nbsp
#&nbsp用。此外需注意有关版权资料在任何的复制或修正下,也应该保持&nbsp
#&nbsp程序完整性。&nbsp
#&nbsp
#———————————————————————-&nbsp
#&nbsp使用的变数如下PROJECT、appName、sAppName与LibraryOut&nbsp
#&nbsp而这些变数的定义包含原始码的目录与输出资料的目录。举例来&nbsp
#&nbsp说,如果project的目录是“&nbsp\library&nbsp”且应用程序就叫做“splash”,而&nbsp
#&nbsp输出的目录是在library底下的“&nbspbin&nbsp”,则原始码的目录将会在&nbsp
#&nbsp\library\splash&nbsp而输出的目录就会在\library\bin。&nbsp
#&nbsp当变数appName超过8个位元时,就使用变数sAppNam,它是&nbsp
#&nbsp变数appName的简称。如果变数appName等於或少於8个位元时&nbsp
#&nbsp则变数appName与sAppName就都一样了。如果你所使用的是不&nbsp
#&nbsp同的目录,则你就 要改变这些变数去符合你的目录结构。&nbsp
#————————————————————————&nbsp
PROJECT&nbsp=&nbsplibrary&nbsp
appName&nbsp=&nbspsplash&nbsp
sAppName&nbsp=&nbspsplash&nbsp
baseDir&nbsp=&nbsp$(&nbspPROJECT&nbsp)&nbsp/&nbsp$(&nbspappName&nbsp)&nbsp/&nbsp
privateInc&nbsp=&nbsp$(&nbspbaseDir&nbsp)&nbsp
langSpec&nbsp=&nbsp$(&nbspbaseDir&nbsp)&nbspenglish&nbsp/&nbsp
LibraryOut&nbsp=&nbsp$(&nbspPROJECT&nbsp)&nbsp/&nbspbin&nbsp/&nbsp
%&nbspinclude&nbspmdl.mki&nbsp#&nbspLoad&nbspstandard&nbsprule&nbspdefinitions.&nbsp
#&nbsp—&nbspDefault&nbspto&nbspcreating&nbspMS95&nbsplibrary&nbsp—-&nbsp
#&nbspMust&nbspspecify&nbspbmake&nbspcommand&nbspline&nbspargument&nbsp"-dMSV5"&nbspto&nbspbuild&nbspfor&nbsp#&nbsp#&nbspMS&nbspVer&nbsp5&nbsp#&nbsp
#———————————————————————-&nbsp
#&nbsp以下定义为此应用系统中代码的附属表,包括任何代码&nbsp
#&nbsp的查询系统或物件与此应用系统间的关联性,一般来说&nbsp
#&nbsp这些档案均与一个附档名为’&nbsp.map’的档案相连结(&nbspMdl&nbsp
#&nbsp程序模组&nbsp)。&nbsp
#&nbsp
#&nbsp注意:所有包含在.mc&nbsp档案中的文字字串应该置於’langSpec’&nbsp
#&nbsp目录下的讯息资源表内,所有的字串在执行时就应要&nbsp
#&nbsp从信息源表中来下载。&nbsp
#———————————————————————-&nbsp
appObjects&nbsp=&nbsp\&nbsp
$(o)&nbsp$(&nbspsAppName&nbsp).mo&nbsp
#———————————————————————-&nbsp
#&nbsp以下定义为此应用系统中任何非使用转换资源的附属表单,&nbsp
#&nbsp一般说来,这些包括了任何指令表单的定义与资源型态的定&nbsp
#&nbsp义,并且这些表单也涵盖了应用系统中代码部分的完整资料&nbsp
#&nbsp。所以一般来说,这些档案资料均置於附档名为’&nbsp.mi&nbsp’的档&nbsp
#&nbsp案中。(&nbspMdl&nbspIntermediate&nbspapplication&nbsp)&nbsp
#———————————————————————-&nbsp
#———————————————————————-&nbsp
#&nbsp建立输出目录&nbsp
#———————————————————————-&nbsp
$(o)$(&nbsptstdir&nbsp)&nbsp:&nbsp$(o)$(&nbsptstdir&nbsp)&nbsp
$(&nbsprscObjects&nbsp)$(&nbsptstdir&nbsp)&nbsp:&nbsp$(&nbsprscObjects&nbsp)$(&nbsptstdir&nbsp)&nbsp
$(&nbspoutputDir&nbsp)$(&nbsptstdir&nbsp)&nbsp:&nbsp$(&nbspoutputDir&nbsp)$(&nbsptstdir&nbsp)&nbsp
$(&nbspLibraryOut&nbsp)$(&nbsptstdir&nbsp)&nbsp:&nbsp$(&nbspLibraryOut&nbsp)$(&nbsptstdir&nbsp)&nbsp
#————————————————————————–&nbsp
#&nbsp以下的部分是要建立任何应用系统模组所需的程序码&nbsp
#————————————————————————–&nbsp
$(o)$(&nbspsAppName&nbsp).mo&nbsp:&nbsp$(&nbspbaseDir&nbsp)$(&nbspsAppName&nbsp).mc&nbsp\&nbsp
$(&nbspprivateInc&nbsp)splash.fdf&nbsp\&nbsp
$(&nbspprivateInc&nbsp)splash.h&nbsp
#—————————————————————————&nbsp
#&nbsp以下的部分会产生MDL&nbsp程序模组。&nbsp
#&nbsp这些模将包含所有程序码与应用系统所使用的资源库。&nbsp
#—————————————————————————&nbsp
$(&nbspLibraryOut&nbsp)$(&nbspappName&nbsp).ml&nbsp:&nbsp$(&nbspappObjects&nbsp)&nbsp
$(&nbspmsg&nbsp)&nbsp
>&nbsp$(o)make.opt&nbsp
a&nbsp#&nbspcreate&nbspnew&nbsp.ml&nbspfile&nbsp
$@&nbsp
$(&nbspappObjects&nbsp)&nbsp
<&nbsp
$(&nbspmLibCmd&nbsp)&nbsp@$(o)make.opt&nbsp
~time&nbsp
%&nbspinclude&nbsp$(&nbspbaseDir&nbsp)$(&nbspappName&nbsp)Rsc.mki&nbsp
表6&nbsp
表头档splash.h&nbsp
/**********************************************************&nbsp
*&nbspCopyright&nbsp(&nbsp1998&nbsp &nbsp2001&nbsp)&nbspBentley&nbspSystems,&nbspInc.,&nbspAll&nbsprights&nbspreserved.&nbsp
*&nbsp
*&nbspDescription:&nbsp
*&nbsp
*&nbspModifications:&nbsp
*==================================================&nbsp
*&nbsp
***********************************************************&nbsp
#&nbspif&nbsp!defined&nbsp(&nbsp__splashH__&nbsp)&nbsp
#&nbspdefine&nbsp__splashH__&nbsp
#&nbspdefine&nbspTXT_SPLASH_BMP&nbsp"&nbspSPLASH_BMP&nbsp"&nbsp/*&nbsphash&nbspdefine&nbspfor&nbspthe&nbspconfig&nbspvariable&nbspname&nbsp*/&nbsp
#&nbspendif&nbsp/*&nbsp__spalshH__&nbsp*/&nbsp
表7&nbsp
功能定义档splash.fdf&nbsp
/**********************************************************&nbsp
*&nbspCopyright&nbsp(&nbsp1998&nbsp &nbsp2001&nbsp)&nbspBentley&nbspSystems,&nbspInc.,&nbspAll&nbsprights&nbspreserved.&nbsp
*&nbsp
*&nbspDescription:&nbsp
*&nbsp
*&nbspModifications:&nbsp
*==================================================&nbsp
*&nbsp
***********************************************************&nbsp
#&nbspif&nbsp!defined&nbsp(&nbsp_splashFDF_&nbsp)&nbsp
#&nbspdefine&nbsp_splashFDF_&nbsp
Public&nbspvoid&nbspsplash_displaySplashWindow&nbsp
(&nbsp
int&nbspsecond&nbsp/*&nbspseconds&nbspthe&nbspdialog&nbspis&nbspopened&nbsp*/&nbsp
) &nbsp
#&nbspendif&nbsp/*&nbsp_splashFDF_&nbsp*/&nbsp
完成的例子&nbsp
表8所说明的是改变原来的原始档案中的主要功能;表9与表10所要说明的是将其他特定的建立安装界面档案加入应用系统中。&nbsp
表8&nbsp
原始档案的变更&nbsp
/*&nbsp包括splash功能定义档案&nbsp*/&nbsp
#&nbspinclude&nbsp“&nbspsplash.fdf&nbsp”&nbsp
/*&nbsp主要功能&nbsp*/&nbsp
int&nbspmain&nbsp
(&nbsp
int&nbspargc.&nbsp
Char&nbsp**argv&nbsp
)&nbsp
{&nbsp
/*&nbsp—————-&nbsp其他程序&nbsp——————–&nbsp*/&nbsp
/*&nbsp开启splash&nbspwindow五秒钟&nbsp*/&nbsp
splash_displaySplashWindow&nbsp(&nbsp5&nbsp);&nbsp
/*&nbsp与一些其他程序码&nbsp*/&nbsp
return&nbspSUCCESS;&nbsp
}&nbsp
表9&nbsp
原始建立档案的变更&nbsp
appObjects&nbsp=\&nbsp
$(0)$(&nbspappName&nbsp).mo&nbsp\&nbsp
$(&nbspmdlLibs&nbsp)mdllib.ml&nbsp\&nbsp
$(&nbspLibraryOut&nbsp)splash.ml&nbsp\&nbsp
$(&nbspmdlLibs&nbsp)ditemlib.ml&nbsp
表10&nbsp
原始建立档案的变更&nbsp
maRscs&nbsp=&nbsp\&nbsp
$(&nbsprscObjects&nbsp)$(&nbspsAppName&nbsp)dlg.rsc&nbsp\&nbsp
$(&nbspLibraryOut&nbsp)splash.rl&nbsp\&nbsp
$(&nbspreqdObjs&nbsp)$(&nbspappName&nbsp).mi&nbsp
结论&nbsp
如果您想要INITAPP应用程序中加入安装界面,且显示的是您客户专有的安装界面并非Microstation&nbsp预设的安装界面,这时您就 要在参数设定档中定义参数MS_NOSPLASH,这需要在系统层面上做设定,并不是在Microstation任何的参数设定档中定义此一参数,它的设定并没有任何特定值,只需将此参数值设为1即可。&nbsp
此外若想在这边提高这个程序的功能,则可以在浮贴资料库中加入按键,以此种方式放入“说明”或&nbsp“关于…”的选项目,以及“确定”或“取消”以结束安装界面对话方块。

发表评论

您的邮箱不会被公开。* 为必填项