InstallShield自定義對(duì)話框淺談_第1頁(yè)
InstallShield自定義對(duì)話框淺談_第2頁(yè)
InstallShield自定義對(duì)話框淺談_第3頁(yè)
InstallShield自定義對(duì)話框淺談_第4頁(yè)
InstallShield自定義對(duì)話框淺談_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、InstallShield自定義對(duì)話框淺談?wù)f明:本文檔的InstallShield為6.22版本,語(yǔ)言:中文。操作系統(tǒng)為Windows2000。資源編輯工具:Microsoft Visual C + 6.0。修改的DLL:_isuer.dll。 此主題相關(guān)圖片如下:InstallShield允許添加自定義對(duì)話框來滿足不同的需求,關(guān)于如何創(chuàng)建一個(gè)新的對(duì)話框資源,有很多參考資料可以查詢,就不多說了。這里主要說明的有以下幾個(gè)方面: 1、  如何創(chuàng)建具有InstallShield Wizard同樣風(fēng)格的對(duì)話框。 2、  如何編寫腳本來控制自定義對(duì)話框上的輸入和控

2、件的有效性判斷 。 一、  創(chuàng)建具有InstallShield Wizard同樣風(fēng)格的對(duì)話框在安裝向?qū)е锌赡苄枰尤胍恍┳远x的步驟,這時(shí)可能需要插入一些自定義的對(duì)話框來作為某步驟,為了能夠把自定義對(duì)話框的步驟完全融入導(dǎo)InstallShield Wizard中,即自定義對(duì)話框要具有和InstallShield標(biāo)準(zhǔn)步驟同樣的風(fēng)格,下圖是InstallShield某標(biāo)準(zhǔn)步驟的圖片:                 標(biāo)準(zhǔn)

3、步驟示例 在上圖中,已經(jīng)把標(biāo)準(zhǔn)向?qū)?duì)話框的一些風(fēng)格標(biāo)注出來了:、,為該步驟功能說明,并且該說明以黑體字表達(dá);為對(duì)該功能的補(bǔ)充說明;為InstallShield的圖標(biāo);為InstallShield的標(biāo)注。 那么如何在自定義對(duì)話框中實(shí)現(xiàn)這些特性呢?下面就對(duì)這四個(gè)特殊地方作說明: 首先,這四個(gè)地方都是一個(gè)標(biāo)簽控件,在VC+中表現(xiàn)為靜態(tài)控件(CStatic)。                   處是表明該步驟功能的地方,那

4、么如何實(shí)現(xiàn)黑體的風(fēng)格呢?其實(shí)InstallShield內(nèi)嵌的機(jī)制已經(jīng)對(duì)此作了定義了。在自定義對(duì)話框上添加一個(gè)靜態(tài)控件,并且設(shè)置該控件的ID為50,并且使Extended Styles中的Transparent屬性有效,然后在Caption中寫上自定義的功能。該控件的位置為(10,3)。設(shè)置了這些后,InstallShield會(huì)自動(dòng)把控件中的字體改為黑體。                   處為該同樣設(shè)置Extend

5、ed Styles的Transparent屬性有效,然后在Caption中寫上補(bǔ)充說明。該控件的位置為(17,15)。                   處為InstallShield的圖標(biāo),該圖標(biāo)也是用靜態(tài)控件來實(shí)現(xiàn)的。在自定義對(duì)話框上添加一個(gè)靜態(tài)控件,設(shè)置該控件的ID為1200,并且使Styles中的Simple屬性有效和Extended Styles的Transparent屬性有效,在Caption中填上:1

6、0550,10551;1;0;0,128,128。該控件的位置為(0,0),大小為(332 x 218)。設(shè)置了這些后,InstallShield會(huì)自動(dòng)在該控件中加入該圖標(biāo)。                   處為InstallShield的標(biāo)注,但是不同于普通效果。在自定義對(duì)話框上添加一個(gè)靜態(tài)控件,設(shè)置該控件的ID為7,把Caption清空,并且把控件的Visible屬性去掉。InstallShield會(huì)自動(dòng)把該

7、控件設(shè)置成標(biāo)準(zhǔn)效果。 在設(shè)置了以上四個(gè)地方之后,還需要在添加一個(gè)靜態(tài)控件,設(shè)置該控件的ID為52,把Caption清空,位置為(0,0),大小為(332 x 218)。運(yùn)行的實(shí)際效果,就和標(biāo)準(zhǔn)的安裝步驟中的效果一樣了。二、 根據(jù)輸入控制對(duì)話框上控件的有效性在自定義了一個(gè)對(duì)話框之后,可能需要對(duì)對(duì)話框上的控件之間的關(guān)系進(jìn)行一些控制,比如當(dāng)選中了某單選框后,使一些控件有效,而選中其他的單選框后,另一些控件有效等等。要實(shí)現(xiàn)這些功能,就需要手動(dòng)編寫InstallShield腳本來實(shí)現(xiàn)了。下面是一個(gè)在安裝向?qū)е刑砑恿艘粋€(gè)自定義對(duì)話框,在該步驟中實(shí)現(xiàn)在安裝的時(shí)候在本機(jī)器上添加一個(gè)SQL Server的數(shù)據(jù)源

8、。圖“自定義對(duì)話框效果圖”是該自定義對(duì)話框的運(yùn)行效果圖:此主題相關(guān)圖片如下:在該自定義對(duì)話框中,除了要完成配置SQL Server的數(shù)據(jù)源之外,還要完成其他一些輔助功能。為了在本機(jī)器上配置一個(gè)SQL Server數(shù)據(jù)源,需要輸入該數(shù)據(jù)源的名稱、該數(shù)據(jù)源是針對(duì)那個(gè)服務(wù)器的以及配置的是用戶數(shù)據(jù)源還是系統(tǒng)數(shù)據(jù)源等數(shù)據(jù),而數(shù)據(jù)庫(kù)和服務(wù)器用戶及口令則是完成輔助功能所需要的。只有當(dāng)輸入了必須的數(shù)據(jù)(如:服務(wù)器、數(shù)據(jù)庫(kù)、用戶名稱、數(shù)據(jù)源等)之后,按鈕“下一步”才能有效,為了達(dá)到這個(gè)要求,就需要對(duì)用戶的輸入進(jìn)行判斷,在InstallShield中可以用WaitOnDialog來得到當(dāng)前對(duì)話框的事件。下面是完成

9、該功能的一個(gè)完整腳本代碼:/ 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數(shù)據(jù)源對(duì)話框/ 參數(shù):/    BOOL bFirstStep:是安裝的第一步嗎?/    BOOL bAllowNotSet:是否允許跳過本次設(shè)置/    BYVAL STRING szTitle:對(duì)話框的標(biāo)題/prototype BuildSQLServerDSN(BOOL, BOOL, BYVAL STRING;/ 校驗(yàn)配置數(shù)據(jù)源對(duì)話框的輸入有效性/ 參數(shù):/    HWND hwndDlg:配置對(duì)話框的句柄,從Cm

13、dGetHwndDlg中得到/    BOOL bAllowNotSet:是否允許跳過本次設(shè)置/ 備注:/    CheckSQLServerDSNInputValid:對(duì)SQLSERVER數(shù)據(jù)源配置進(jìn)行校驗(yàn)/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定義一個(gè)對(duì)話框        nMessage = EzDefineDialog(DSN_SQLSERVER_DLG, ISUSER, "", DLG_DSN_SQLSERVER;        if(nMessage = DLG_ERR then            MessageBox("不能進(jìn)行配置S

29、QLSERVER數(shù)據(jù)源找不到對(duì)話框", 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數(shù)據(jù)源對(duì)話框", SEVERE;              

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

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

37、0;               case SD_PBUT_CONTINUE:                / 調(diào)用接口添加一個(gè)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("沒有輸入服務(wù)器,是否以后進(jìn)行配置?", 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("沒有輸入數(shù)據(jù)庫(kù),是否以后進(jìn)行配置?", YES = NO then                        _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_DB;       

45、             else                        bDone = TRUE;             

46、60;      endif;                elseif(StrLength(szDBUserName = 0 then                    if(AskYesNo("沒有輸入數(shù)據(jù)庫(kù)用

47、戶,是否以后進(jìn)行配置?", YES = NO then                        _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_USER_NAME;             

48、60;      else                        bDone = TRUE;                    endif

49、;                elseif(StrLength(szSQLDSN = 0 then                    if(AskYesNo("沒有輸入數(shù)據(jù)源名稱,是否以后進(jìn)行配置?", YES = NO then  

50、0;                     _WinSubFocusControl(hwndDlg, IDC_EDIT_SQLSERVER_DSN;                    else  

51、0;                     bDone = TRUE;                    endif;         

52、;       else                    / 已經(jīng)獲取了所有數(shù)據(jù),可以調(diào)用SQLConfigDataSource添加數(shù)據(jù)源了                  

53、0; / 組織語(yǔ)句                    / 注:由于DSN不保存UID和PWD,所以在Attribute中不能加入這兩個(gè)                    /    關(guān)鍵字,并且

54、每個(gè)關(guān)鍵子之間用'0'分割,由于InstallShield                    /    中不支持一個(gè)字符串中間存在'0',因此,不能直接用+連接這些                

55、;    /    關(guān)鍵字,下面是一個(gè)變通的方法                    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'                    / 調(diào)用ODBCCP32中的SQLConfigDataSource添加一個(gè)DSN 

64、0;                  / 如果返回FALSE,表示添加失敗,這時(shí)可以調(diào)用                    / 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 = "配置數(shù)據(jù)源失敗"

72、; + szErrMsg + "!是否以后進(jìn)行配置?"                                if(AskYesNo(szErrMsg, YES = NO then        

73、60;                           bDone = FALSE;                      

74、;          else                                    bDone = TRUE;    &#

75、160;                           endif;                       

76、     else                                szErrMsg = "配置數(shù)據(jù)源失敗" + 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("輸入了無效的數(shù)據(jù)源名稱!", 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論