InstallShield自定义对话框浅谈_第1页
InstallShield自定义对话框浅谈_第2页
InstallShield自定义对话框浅谈_第3页
InstallShield自定义对话框浅谈_第4页
InstallShield自定义对话框浅谈_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、InstallShield自定义对话框浅谈说明:本文档的InstallShield为6.22版本,语言:中文。操作系统为Windows2000。资源编辑工具:Microsoft Visual C + 6.0。修改的DLL:_isuer.dll。 此主题相关图片如下:InstallShield允许添加自定义对话框来满足不同的需求,关于如何创建一个新的对话框资源,有很多参考资料可以查询,就不多说了。这里主要说明的有以下几个方面: 1、  如何创建具有InstallShield Wizard同样风格的对话框。 2、  如何编写脚本来控制自定义对话框上的输入和控

2、件的有效性判断 。 一、  创建具有InstallShield Wizard同样风格的对话框在安装向导中可能需要加入一些自定义的步骤,这时可能需要插入一些自定义的对话框来作为某步骤,为了能够把自定义对话框的步骤完全融入导InstallShield Wizard中,即自定义对话框要具有和InstallShield标准步骤同样的风格,下图是InstallShield某标准步骤的图片:                 标准

3、步骤示例 在上图中,已经把标准向导对话框的一些风格标注出来了:、,为该步骤功能说明,并且该说明以黑体字表达;为对该功能的补充说明;为InstallShield的图标;为InstallShield的标注。 那么如何在自定义对话框中实现这些特性呢?下面就对这四个特殊地方作说明: 首先,这四个地方都是一个标签控件,在VC+中表现为静态控件(CStatic)。                   处是表明该步骤功能的地方,那

4、么如何实现黑体的风格呢?其实InstallShield内嵌的机制已经对此作了定义了。在自定义对话框上添加一个静态控件,并且设置该控件的ID为50,并且使Extended Styles中的Transparent属性有效,然后在Caption中写上自定义的功能。该控件的位置为(10,3)。设置了这些后,InstallShield会自动把控件中的字体改为黑体。                   处为该同样设置Extend

5、ed Styles的Transparent属性有效,然后在Caption中写上补充说明。该控件的位置为(17,15)。                   处为InstallShield的图标,该图标也是用静态控件来实现的。在自定义对话框上添加一个静态控件,设置该控件的ID为1200,并且使Styles中的Simple属性有效和Extended Styles的Transparent属性有效,在Caption中填上:1

6、0550,10551;1;0;0,128,128。该控件的位置为(0,0),大小为(332 x 218)。设置了这些后,InstallShield会自动在该控件中加入该图标。                   处为InstallShield的标注,但是不同于普通效果。在自定义对话框上添加一个静态控件,设置该控件的ID为7,把Caption清空,并且把控件的Visible属性去掉。InstallShield会自动把该

7、控件设置成标准效果。 在设置了以上四个地方之后,还需要在添加一个静态控件,设置该控件的ID为52,把Caption清空,位置为(0,0),大小为(332 x 218)。运行的实际效果,就和标准的安装步骤中的效果一样了。二、 根据输入控制对话框上控件的有效性在自定义了一个对话框之后,可能需要对对话框上的控件之间的关系进行一些控制,比如当选中了某单选框后,使一些控件有效,而选中其他的单选框后,另一些控件有效等等。要实现这些功能,就需要手动编写InstallShield脚本来实现了。下面是一个在安装向导中添加了一个自定义对话框,在该步骤中实现在安装的时候在本机器上添加一个SQL Server的数据源

8、。图“自定义对话框效果图”是该自定义对话框的运行效果图:此主题相关图片如下:在该自定义对话框中,除了要完成配置SQL Server的数据源之外,还要完成其他一些辅助功能。为了在本机器上配置一个SQL Server数据源,需要输入该数据源的名称、该数据源是针对那个服务器的以及配置的是用户数据源还是系统数据源等数据,而数据库和服务器用户及口令则是完成辅助功能所需要的。只有当输入了必须的数据(如:服务器、数据库、用户名称、数据源等)之后,按钮“下一步”才能有效,为了达到这个要求,就需要对用户的输入进行判断,在InstallShield中可以用WaitOnDialog来得到当前对话框的事件。下面是完成

9、该功能的一个完整脚本代码:/ kdcis.rul/#ifndef _KDCIS_RUL_#define _KDCIS_RUL_ #include "winsysdll.h"/ Pre-defined script dialog constants/                 / - Attribute Dialog Controls -#define DLG_DSN_SQLSERVER  &

10、#160; 30001#define IDC_RADIO_DSN_USER    1001#define IDC_RADIO_DSN_SYSTEM   1002#define IDC_EDIT_DB_ADDR                1003#define IDC_EDIT_SQLSERVER_USER_NAME 1004#define IDC_EDIT_SQL

11、SERVER_USER_PWD 1005#define IDC_EDIT_SQLSERVER_DSN   1006#define IDC_EDIT_SQLSERVER_DB   1007        file:/-        / Function prototypes        file:/-/ 显示配置SQ

12、LSERVER数据源对话框/ 参数:/    BOOL bFirstStep:是安装的第一步吗?/    BOOL bAllowNotSet:是否允许跳过本次设置/    BYVAL STRING szTitle:对话框的标题/prototype BuildSQLServerDSN(BOOL, BOOL, BYVAL STRING;/ 校验配置数据源对话框的输入有效性/ 参数:/    HWND hwndDlg:配置对话框的句柄,从Cm

13、dGetHwndDlg中得到/    BOOL bAllowNotSet:是否允许跳过本次设置/ 备注:/    CheckSQLServerDSNInputValid:对SQLSERVER数据源配置进行校验/prototype CheckSQLServerDSNInputValid(HWND, BOOL;               file:/-  &#

14、160;     / Variable declaration        file:/-                  file:/-        / Macro declaration &

15、#160;      file:/-#define DSN_SQLSERVER_DLG "ConfigSQLServerDSNDLG"/*-*/ /*                               

16、;                                         */ /*   Function:  BuildSQLServer

17、DSN                                         */ /*        

18、60;                                                 

19、60;             */ /*   Descrip:   use custom sqlserver's dsn dlg to create dsn.             */ /*         

20、;                                                  

21、;             */ /*   Misc:                                 

22、                               */ /*                  &

23、#160;                                                 &

24、#160;   */ /*-*/ function BuildSQLServerDSN(bFirstStep, bAllowNotSet,szTitle           BOOL bDone;           NUMBER nMessage;           

25、;STRING szSQLAddr, szSQLDB, szDBUserName, szDBUserPwd, szSQLDSN;           SHORT nDSNType;           STRING svArg1024;           STRING svDSN, svAddr,

26、 svDB, svUID, svPWD;           NUMBER nSplitPos;           HWND hwndDlg;           BOOL bBuildResult;         

27、  SHORT wErrMsgLen;           STRING szErrMsgMAX_PATH + 1;           LONG dwErrCode;    begin               bDone = FALS

28、E; / 用EzDefineDialog定义一个对话框        nMessage = EzDefineDialog(DSN_SQLSERVER_DLG, ISUSER, "", DLG_DSN_SQLSERVER;        if(nMessage = DLG_ERR then            MessageBox("不能进行配置S

29、QLSERVER数据源找不到对话框", SEVERE;            bDone = TRUE;        endif;        while(bDone = FALSE            nMessage = WaitOnDialog(DSN_SQ

30、LSERVER_DLG;            switch(nMessage            case DLG_INIT:                       &#

31、160; hwndDlg = CmdGetHwndDlg(DSN_SQLSERVER_DLG;                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;                if(bFirstStep then  &

32、#160;                 _WinSubEnableControl(hwndDlg, SD_PBUT_BACK, 0;                endif;           

33、;     _WinSubSetWindowTitle(hwndDlg, szTitle;                CtrlSetState(DSN_SQLSERVER_DLG, IDC_RADIO_DSN_USER, BUTTON_CHECKED;              

34、60;            case DLG_ERR:                MessageBox("不能显示配置SQLSERVER数据源对话框", SEVERE;              

35、0; bDone = TRUE;                           case CANCEL:                bDone = TRUE;     &

36、#160;                     case DLG_CLOSE:                bDone = TRUE;           

37、0;               case SD_PBUT_CONTINUE:                / 调用接口添加一个dsn                / .  &

38、#160;             CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_DB_ADDR, szSQLAddr;                CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_DB, szSQLDB;   &#

39、160;            CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_USER_NAME, szDBUserName;                CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_USER_PWD, szDBUserP

40、wd;                CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_DSN, szSQLDSN;                if(StrLength(szSQLAddr = 0 then      

41、;              if(AskYesNo("没有输入服务器,是否以后进行配置?", YES = NO then                        _WinSubFocusControl(hwndDlg, I

42、DC_EDIT_DB_ADDR;                    else                        bDone = TRUE;    

43、0;               endif;                elseif(StrLength(szSQLDB = 0 then               

44、60;    if(AskYesNo("没有输入数据库,是否以后进行配置?", YES = NO then                        _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_DB;       

45、             else                        bDone = TRUE;             

46、60;      endif;                elseif(StrLength(szDBUserName = 0 then                    if(AskYesNo("没有输入数据库用

47、户,是否以后进行配置?", YES = NO then                        _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_USER_NAME;             

48、60;      else                        bDone = TRUE;                    endif

49、;                elseif(StrLength(szSQLDSN = 0 then                    if(AskYesNo("没有输入数据源名称,是否以后进行配置?", YES = NO then  

50、0;                     _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_DSN;                    else  

51、0;                     bDone = TRUE;                    endif;         

52、;       else                    / 已经获取了所有数据,可以调用SQLConfigDataSource添加数据源了                  

53、0; / 组织语句                    / 注:由于DSN不保存UID和PWD,所以在Attribute中不能加入这两个                    /    关键字,并且

54、每个关键子之间用'0'分割,由于InstallShield                    /    中不支持一个字符串中间存在'0',因此,不能直接用+连接这些                

55、;    /    关键字,下面是一个变通的方法                    if(CtrlGetState(DSN_SQLSERVER_DLG, IDC_RADIO_DSN_USER = BUTTON_CHECKED then          &

56、#160;             nDSNType = ODBC_ADD_DSN;                    else               

57、;         nDSNType = ODBC_ADD_SYS_DSN;                    endif;                  

58、60; svDSN = "DSN=" + szSQLDSN;                    svAddr = "SERVER=" + szSQLAddr;                   

59、 svDB = "DATABASE=" + szSQLDB;                    svUID = "UID=" + szDBUserName;                   

60、svPWD = "PWD=" + szDBUserPwd;                    svArg = svDSN + ' ' + svAddr + ' ' + svDB;                &#

61、160;   nSplitPos = StrLength(svDSN;                    svArgnSplitPos = '0'                    nSplitP

62、os += StrLength(svAddr + 1;                    svArgnSplitPos = '0'                    nSplitPos += StrLength(sv

63、DB + 1;                    svArgnSplitPos = '0'                    / 调用ODBCCP32中的SQLConfigDataSource添加一个DSN 

64、0;                  / 如果返回FALSE,表示添加失败,这时可以调用                    / SQLInstallerError来得到失败的原因      &#

65、160;             bBuildResult = SQLConfigDataSource(NULL, nDSNType, "SQL Server", svArg;                    if(bBuildResult then   

66、;                         / 如果添加成功                         &

67、#160;  bDone = TRUE;                        else                       

68、0;    / 添加失败                                             

69、60;                                          wErrMsgLen = MAX_PATH;      &#

70、160;                     SQLInstallerError(1, &dwErrCode, szErrMsg, wErrMsgLen, &wErrMsgLen;                 

71、60;          if(bAllowNotSet then                                 szErrMsg = "配置数据源失败"

72、; + szErrMsg + "!是否以后进行配置?"                                if(AskYesNo(szErrMsg, YES = NO then        

73、60;                           bDone = FALSE;                      

74、;          else                                    bDone = TRUE;    &#

75、160;                           endif;                       

76、     else                                szErrMsg = "配置数据源失败" + szErrMsg + "!"      &

77、#160;                         MessageBox(szErrMsg, SEVERE;                     &

78、#160;      endif;                        endif;                endif;     &

79、#160;                     case SD_PBUT_BACK:                / 上一步            

80、60;   bDone = TRUE;                           case SD_PBUT_EXITSETUP:                bDone = TRUE; &

81、#160;                     case IDC_RADIO_DSN_USER:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;    

82、                   case IDC_RADIO_DSN_SYSTEM:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;      

83、60;                case IDC_EDIT_DB_ADDR:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;         

84、0;             case IDC_EDIT_SQLSERVER_USER_NAME:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;           

85、;            case IDC_EDIT_SQLSERVER_USER_PWD:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;             

86、          case IDC_EDIT_SQLSERVER_DSN:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;               &

87、#160;       case IDC_EDIT_SQLSERVER_DB:                CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet;                 

88、60;     endswitch;                   endwhile;               EndDialog(DSN_SQLSERVER_DLG;        ReleaseDialog

89、(DSN_SQLSERVER_DLG;               if(nMessage = SD_PBUT_CONTINUE then            return NEXT;        elseif(nMessage = SD_PBUT_BACK then     

90、;       return BACK;        else            Do(EXIT;        endif;    end;/*-*/ /*           &#

91、160;                                                 &#

92、160;          */ /*   Function:  CheckSQLServerDSNInputValid                            &#

93、160;  */ /*                                               &#

94、160;                        */ /*   Descrip:   check the input data is valid.              

95、;                       */ /*       do not need to check the pwd if empty              

96、60;             */ /*   Misc:                                

97、0;                               */ /*                  

98、;                                                  

99、;    */ /*-*/   function CheckSQLServerDSNInputValid(hwndDlg, bAllowNotSet       STRING szDBUserName;       STRING szSQLDB;       STRING szSQLAddr;      &#

100、160;STRING szSQLDSN;   begin               if(bAllowNotSet then            _WinSubEnableControl(hwndDlg, SD_PBUT_CONTINUE, 1;          

101、  return 1;        endif;               if(CtrlGetState(DSN_SQLSERVER_DLG, IDC_RADIO_DSN_USER = BUTTON_UNCHECKED &&           (CtrlGetState(DSN_SQL

102、SERVER_DLG, IDC_RADIO_DSN_SYSTEM = BUTTON_UNCHECKED then               _WinSubEnableControl(hwndDlg, SD_PBUT_CONTINUE, 0;               return 0;   &#

103、160;    endif;        CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_USER_NAME, szDBUserName;        if(StrLength(szDBUserName = 0 then            _WinSubEnableControl(hwnd

104、Dlg, SD_PBUT_CONTINUE, 0;            return 0;        endif;        CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_DSN, szSQLDSN;        if(StrLength(szSQLDS

105、N = 0 then            _WinSubEnableControl(hwndDlg, SD_PBUT_CONTINUE, 0;            return 0;        else            if(

106、!SQLValidDSN(szSQLDSN then                MessageBox("输入了无效的数据源名称!", INFORMATION;                _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_DSN;                return 0;            endif;        endif;        CtrlGetText(DSN_SQLSERVER_DLG, IDC_EDIT_SQLSERVER_DB,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论