程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 在Visual C++中定制AppWizard (二)

在Visual C++中定制AppWizard (二)

編輯:關於VC++

第二部分 創建一個簡單的AppWizard

在第一部分中我們介紹了Custom AppWizard的概念及其工作原理。在這一部分,我們將嘗試用Custom AppWizards來創建一個最簡單的Custom AppWizard。

首先,我們先創建一個什麼事情也不做的Custom AppWizard,主要是了解它的創建過程和步驟。按Ctrl +N 打開New對話框,新建一個Custom AppWizards工程。填入工程名字後單擊OK,從步進對話框的標題中,我們可以了解到總共有兩個步驟,在第一個步的對話框中包含三個輸入域。

第一個輸入域是新Custom AppWizards的起點。它有三個單選按鈕:

l Existing project——這個選項是以一個現存的工程作為藍本來創建Custom AppWizards。使用這個選項有兩個缺點。第一,AppWizards創建的是一個已經存在的工程。第二,AppWizards創建的工程文件名和類名必須與現存工程的文件名和類名一致。

l Standard MFC AppWizard steps——這個選項是最常用的選項,它創建的AppWizard模板可用於每一種MFC支持的工程類型。從修改各種MFC工程模板文件的靈活性方面,這個選項也是最靈活的。因為這是最通用的一種定制AppWizard類型,所以我們將以它為例。

l Your own customized steps——這個選項全新定制一組步進對話框和選項。例如,假設你需要一個定制的AppWizard來自動創建一個非MFC應用程序。這時你就得用這個選項創建所有自己定制的對話框。

第二個輸入域讓你命名新建的定制AppWizard。這個名字將被用於顯示在New Project List對話框中.

最後一個輸入域用來指定定制步進的數目或者對話框的數目,它將被添加到新的定制AppWizard中。有時候我們不需要額外的步進對話框,比如我們即將創建的簡單AppWizard就不用任何步進。但在第三部分中,我們將會學習如何定制步進對話框。

接下來,按Next按鈕繼續到定制AppWizard的第二步(對話框),也是最後一步。這個對話框中有兩個域都是自解釋的。第一個域定義新定制的AppWizard是個可執行程序還是一個DLl 。第二個域指定語言支持選項。

設置工程的缺省選項

前面我們講過用AppWizard創建工程時可以有多種類型可以選擇。這一部分我們創建的AppWizard名字叫SDIAutomationWiz,在默認情況下,用這個AppWizard創建的工程類型是支持自動化的SDI工程。

打開工程的New 對話框,在Project List中選擇Custom AppWizard,在Project Name編輯框中輸入SDIAutomationWiz,單擊OK進入第一個步進對話框,選擇“Standard MFC AppWizard steps”,然後指定一個它在Project List中顯示的名字。因為這個AppWizard沒有額外的步進對話框,因此步進數編輯框中填寫0,單擊Next按鈕到下一步。選擇“MFC AppWizard Executable”,語言支持為中文,單擊Finish按鈕,出現確認對話框。單擊OK後便開始創建新的AppWizard工程。

——定義CCustomAppWiz 類

雖然編譯後的Custom AppWizard文件擴展名都是.awx,但是它實際上就是一個通常我們使用的Windows動態鏈接庫(DLl )文件。如果你打開SDIAutomationWiz.cpp文件,你就會看到如下的DLLMain()函數代碼:

// Defining the DLLMain() Function
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
if (dwReason == DLl _PROCESS_ATTACH)
{
TRACE0("SDIAUTOMATIONWIZ.AWX Initializing!\n");
// Extension DLl one-time initialization
AfxInitExtensionModule(SDIAutomationWizDLl , hInstance);
// Insert this DLl into the resource chain
new CDynLinkLibrary(SDIAutomationWizDLl );
// Register this Custom AppWizard with MFCAPWZ.DLl 
SetCustomAppWizClass(&SDIAutomationWizaw);
}
else if (dwReason == DLl _PROCESS_DETACH)
{
TRACE0("SDIAUTOMATIONWIZ.AWX Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(SDIAutomationWizDLl );
}
return 1;  // ok
}

除了常規的CDynLinkLibrary MFC擴展動態鏈接庫例程之外,還有一個對SetCustomAppWizClass()函數的調用。這個函數是從MFCAPWZ.DLL輸出的,用於傳遞定制AppWizard 中CCustomAppWiz派生類的指針。因為MFCAPWZ.DLL通過調用CCustomAppWiz的成員函數來控制所有AppWizard的執行,因此它必須用這個指針來調用CCustomAppWiz派生類中重載的成員函數。

有一點必須牢記在心,那就是盡管你創建了定制的AppWizard,但MFCAPWZ.DLL仍然控制著一切。換句話說,你定制的AppWizard只是用於顯示步進對話框,確定對話框以什麼順序顯示,以及設置新工程的模人選項。一些重要的工作,諸如解析模板文件,合並Dictionary中的宏和模板文件中的占為符,創建工程文件等等還是要MFCAPWZ.DLL來做。

前面我們講過,CCustomAppWiz類負責AppWizard與MFCAPWZ.DLL之間的通訊。實際上這種通訊是單邊的。MFCAPWZ.DLL告訴你的CCustomAppWiz對象什麼時候需要調用相應的虛擬成員函數。

CCustomAppWiz類中大約有十來個函數,其中只有五個函數是可以看到並使用的常用例程。通過這些函數的命名你基本上就能了解其主要作用。例如,InitCustomAppWiz()函數是進行初始化,包括初始化宏。除此之外,ExitCustomAppWiz()函數的作用是卸載AppWizard。

另外,還有兩個函數用來控制步進對話框的顯示順序。Next()和Back()。不說肯定你也知道,這兩個函數與AppWizard對話框中的Next和Back按鈕是關聯的。

最後一個很重要的函數是CustomizeProject(),一旦程序員完成工程選項的設置,AppWizard便創建工程的make文件並定義工程缺省的debug和release配置。然後AppWizard調用CustomizeProject()函數,以便定制的AppWizard能在存儲工程之前修改make文件設置。

——宏指令的處理

我們已經知道了宏的初始化是在InitCustomAppWiz()中進行的,我們也知道了CCustomAppWiz類有一個成員變量m_Dictionary,它存儲宏名及其值。因為這個成員變量是CMapStringToString類型的,用標准的MFC映射函數就能get或者set不同的宏,請看下列代碼:

// retrieve value for Automation
CString strValue;
m_Dictionary.Lookup(_T("AUTOMATION"), strValue);
// Include support for context sensitive help
m_Dictionary.SetAt(_T("HELP"), strValue.Compare("1"));

現在打開SDIAutomationWizAW.cpp文件,在InitCustomAppWiz()函數末尾敲入:

m_Dictionary.SetAt(_T("PROJTYPE_SDI"), _T("1"));
m_Dictionary.SetAt(_T("PROJTYPE_MDI"), _T("0"));
m_Dictionary.SetAt(_T("AUTOMATION"), _T("1"));

然後構造(build)定制的AppWizard工程。如果沒有出錯的話,AppWizard的.awx文件會被自動拷貝到專門的目錄中,以便MFCAPWZ.DLL能找到它。

現在按下Ctrl +N,新定制的AppWizard應該出現在New對話框的Project清單中。如果你使用新的AppWizard,你會看到工程的默認選項是SDI程序並支持自動化。通過這個簡單的Demo,我們基本上了解了如何通過定制AppWizard來設置默認的工程選項。

如果要分發你創建的AppWizard,只要分發.awx文件就可以了,把它拷到Visual Studio的模板文件目錄即可。

在這一部分,我們定制了一個簡單的AppWizard,通過一個例子示范了如何處理宏字典。在第三部分中,我們將涉及更多定制AppWizard的內容,並且還要制作一個實用價值很高的AppWizard。包括新增加一個步進對話框,獲得新步進對話框中的輸入信息。用這個定制的AppWizard創建的所有工程都會在其“關於”對話框中顯示在步進對話框輸入的信息,並通過靜態控制和圖像建立URL鏈接。此外,用這個AppWizard創建的每一個源文件都會自動建立程序員自己的專用注釋。

[待續]

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved