第一部分 AppWizard及其工作原理
AppWizard即應用程序向導,它是Visual Studio開發環境中強大的編程工具之一,用它可以創建各種不同類型的程序。比如Win32應用、ATL、MFC應用等等。在Windows的術語中,向導(wizard)一詞指得是一個應用程序,它的一個主要特點就是提供一系列對話框引導用戶進行必要的選擇來完成給定的任務。VC中的應用程序向導——AppWizard提供一系列特定工程類型對話框來讓程序員定義各種類型的新工程。其中每一個對話框都顯示一些用來指定工程類型的選項。例如,用AppWizard創建Windows DLL的時候,第一個對話框讓程序員指定諸如要創建什麼類型的DLL,是常規類型還是MFC擴展類型,是否要包括自動化支持,以及要不要源代碼注釋等等。
根據程序員所填充的對話框,AppWizard會自動創建構造工程所需的框架文件,它們包括:工程文件、工作間文件、源代碼文件、頭文件、資源文件等等。AppWizard是Visual Studio開發環境中使用最多的工具之一。盡管如此,AppWizard也有它的不足之處。那就是常用的工程類型都是內建在Visual Studio中,無法創建自己的AppWizard。自從有了Custom AppWizard(Visual C++ 4.0)以後,這個問題得到了解決。Custom AppWizard也就是定制的AppWizard。在創建類似的多個工程時,Custom AppWizards顯得特別有用。例如你創建的工程都是SDI,並且都支持自動化(automation),那麼你就可以創建一個自己定制的 AppWizard,將SDI自動化設為默認選項。這樣可以提高工作效率。此外,利用Custom AppWizard也可以創建具有個性化的工程。例如你想要所有工程都有一個“關於”對話框,並且在這個對話框中顯示個人信息或者公司的標徽及其它專有信息,每個源代碼文件中都加上自己的專門注釋。那麼通過創建一個Custom AppWizard很容易實現這個需求。你甚至可以定義並顯示自己定制的對話框來收集工程類型所需的信息和選項。本文的第一部分我們將討論AppWizard的工作原理,然後在後續部分中循序漸進地學習如何創建Custom AppWizard。最終我們將創建一個在實際編程中非常實用的Custom AppWizard。並提供全部源代碼。
在學會使用Custom AppWizard之前,首先必須了解AppWizard的工作原理,理解 AppWizard是如何根據不同的用戶選擇來創建工程的。
AppWizard有一個管理裝置(manager),它不是一個單獨的應用程序。Custom AppWizard運行於Visual Studio框架之中。AppWizard的這個所謂的“管理器”,實際上就是MFCAPWZ.DLL,它控制不同的AppWizard執行。在創建新工程的對話框中,“Project”標簽是默認的選項,列表框中顯示出內建的工程類型。此外,這個列表框中還列出用戶定制的AppWizard,如圖一所示。
圖一
這些定制AppWizard文件擴展名為*.awx,它們存放在一個特定的目錄中。如果安裝VC6.0時是按照默認的路徑安裝的,則定制的AppWizard文件在成功編譯後都會被存放到\Program Files\Microsoft Visual Studio\Common\MSDev98\Template文件夾中。注意列表框中此新的列表項“MFC AppWizard (exe) – VC知識庫”,這就是我們後面要定制的AppWizard。從這裡可以看出,只要產生了*.awx文件,那麼它就會與標准的(或者說內建的)Visual C++ AppWizard一起自動顯示在這個列表框中。
——CCustomAppWiz 類和Dictionary字典
CCustomAppWiz 基類提供了MFCAPWZ.DLL 和Custom AppWizard之間的通訊服務。CCustomAppWiz()成員函數的實現就在MFCAPWZ.DLL中。為了實現特定應用的行為,你只要從CCustomAppWiz派生一個類,改寫相應的虛擬函數,然後在MFCAPWZ.DLL運行時調用SetCustomAppWizClass()函數注冊派生類即可。
通常,AppWizard顯示一系列對話框獲取創建新工程所需的設置。每一個步進對話框顯示不同的選項。AppWizard將這些選項的值存儲在一個串映射中。這個串映射就叫做Dictionary字典。Dictionary字典實際上是一個CCustomAppWiz 類的成員變量(m_Dictionary),其類型為CMapStringToString。Dictionary將AppWizard宏映射到相關聯的值。這裡所說的宏是指工程選項或設置的名稱。例如,在創建MFC的時候,你可以選擇應用程序為SDI,那麼,Dictionary中就會有一個名為PROJTYPE_SDI的宏。Dictionary中這個項目的值就是1,否則這個與這個宏關聯的值為0。
m_Dictionary成員變量可以被用於創建宏,刪除宏或者更新宏的值。因為m_Dictionary是一個CMapStringToString對象,肯定有相應的成員函數存取不同宏的值。下面的代碼返回PROJTYPE_SDI宏的值,它被用於判斷這個工程是不是一個SDI應用。
m_Dictionary.Lookup("PROJTYPE_SDI", m_strProjType);
if (_T("1") == m_strProjType)
{
// SDI類型應用
}
else // 其它類型的程序
{
}
MFCAPWZ.DLL提供了一些標准宏,任何其它定制AppWizard所需要的宏都可以用SetAt函數添加到Dictionary字典中。你從在線文檔中可以找到六十多個標准宏
當你創建Custom AppWizard並按下Finish按鈕後,MFCAPWZ.DLL用Dictionary創建新的工程文件。每一個AppWizard(不論是標准的還是定制的)都有一套模板文件用於創建AppWizard生成的工程源文件。Dictionary中的值被用於與模板文件相連接來創建最終的輸出(新的工程文件)。下面是一個例子,中文的基於對話框程序的模板資源文件名叫DlgLoc_chs.rc。下面是從中摘錄出的一段:
...
IDD_ABOUTBOX DIALOGEX 0, 0, 160, 129
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "關於$$ROOT$$"
...
注意這裡 $$ROOT$$ 串的用法。當MFCAPWZ.DLL創建新工程文件時,它首先掃描每一個模板,查找以$$開始並以$$結尾的串。在這兩個前綴和後綴之間的文本串叫做占位苻。每一個占位符是Dictionary中一個宏的名字。MFCAPWZ.DLL在Dictionary中查詢占位符的值並用這個值替換占位符。當所有的占位符都被Dictionary中相應的值替換之後,工程文件也就產生了。
——用MFCAPWZ.DLL替代占為符
為了理解MFCAPWZ.DLL用Dictionary中宏的值替換模板文件的占位符。我們來做一個實驗:
1、 用AppWizard創建一個基於對話框的應用程序,將工程取名為MyTestDlgApp。
2、 創建完工程之後,以文本方式打開MyTestDlgApp.rc文件。
3、 找到IDD_ABOUT的對話框模板資源。
4、 你應該看到原來模板文件中$$ROOT$$占位符已經被工程的名字(MyTestDlgApp)替換掉了。這是因為Dictionary有一個ROOT宏,其缺省值被設置為工程的名字。
宏即可被用於定義模板文件中指定的占位符的替換值,有時AppWizard也用宏來協助步進對話框的顯示,或者確定用哪個模板來創建新的工程文件。例如,如果Dictionary中PROJTYPE_SDI宏的值為1,則創建的應用程序是SDI類型。但是,如果PROJTYPE_DLG宏的值為1的話,創建的應用程序是基於對話框的。根據宏的值是否為1,MFCAPWZ.DLL使用不同的模板文件來創建工程文件。
大多數AppWizard都由一系列固定的對話框組成。其中後一個對話框的顯示完全依賴於前一個對話框所選擇的選項來決定。這種多步進對話框形式稱為軌跡。創建MFC應用程序的AppWizard是一個多軌跡的AppWizard。
——多軌跡AppWizard
多軌跡AppWizard提供了更為復雜的應用程序設置。為了理解多軌跡AppWizard概念,請做一個如下實驗:
1、 按下Ctrl+N創建新工程
2、 單擊“Project”標簽,然後選中“MFC AppWizard (exe)”。
3、 注意對話框的標題條內容為“MFC AppWizard - Step 1”,沒有指明總共有幾步,這是因為總共的步進數在你決定要創建的MFC工程類型前時未知的。
4、 看一下不同類型工程的選項有何差別:single document (SDI),multiple document (MDI),和 dialog-based。選擇multiple document (MDI)類型,然後單擊Next按鈕。
5、 注意標題條的內容中指定了總共的步進數——“MFC AppWizard - Step 2 of 6”。由於你選擇了MDI類型,這個類型總共有六個步進對話框,每一個步進對話框包含特定的基於文檔的MFC應用程序選項。
6、 單擊Back按鈕,選擇基於對話框的工程類型,然後單擊Next按鈕。這一次標題條的內容指定的步進總數是——“MFC AppWizard - Step 2 of 4”。這說明創建基於對話框的應用程序共有四個步進對話框。
以上是對AppWizards 及其工作原理的討論。在下一部分我們將嘗試創建一個簡單的Custom AppWizard。
[待續]