




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 制作木版畫課件
- 初中語(yǔ)文文摘職場(chǎng)向失敗者學(xué)習(xí)成功
- 腫瘤疼痛的護(hù)理措施
- 中介地產(chǎn)租房合同范例
- 紫色幾何風(fēng)數(shù)學(xué)系專業(yè)畢業(yè)論文答辯
- 儀表服務(wù)采購(gòu)合同范例
- 代銷代賣合同范例
- 兒歌配畫面試題及答案
- 修復(fù)墻體合同范例
- 住宅商鋪轉(zhuǎn)讓合同范例
- 2024中國(guó)兒童大腦發(fā)育白皮書
- 某幼兒園食物中毒事故應(yīng)急預(yù)案
- DB61T 5097-2024 強(qiáng)夯法處理濕陷性黃土地基技術(shù)規(guī)程
- 南瓜小房子故事課件
- 2024-2030年中國(guó)地鐵廣告行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 高等職業(yè)學(xué)校人工智能技術(shù)應(yīng)用專業(yè)實(shí)訓(xùn)教學(xué)條件建設(shè)標(biāo)準(zhǔn)
- 2025年高考生物總復(fù)習(xí):減數(shù)分裂和受精作用
- 某大學(xué)中西醫(yī)臨床(專升本)學(xué)士學(xué)位考試復(fù)習(xí)題
- 運(yùn)動(dòng)損傷預(yù)測(cè)與預(yù)防技術(shù)
- 教科版科學(xué)三年級(jí)下冊(cè)第一單元《 物體的運(yùn)動(dòng)》測(cè)試卷含答案【完整版】
- 2024中考百日誓師-家長(zhǎng)會(huì)
評(píng)論
0/150
提交評(píng)論