我選擇編寫的這一應用程序,雖然相對簡單,但你卻可以從中知道怎么去編寫比較復雜的程序(比“Hello World.”復雜)。這一應用程序包括屬性頁和屬性表,即所說的TAB控件,它含有自定義的圖標和跳格符,能把參數選擇保存到注冊表中。
程序開發的一個關鍵之處是保持和微軟用戶界面相一致的特性。在開發過程中我盡可能的采用了微軟的應用程序的字體和布局,商業開發人員更應該為他們的Windows CE應用程序設計出優美的界面。
類結構
所有的代碼加起來也有幾千行,共分為5個文件。我選擇用微軟基礎類庫(MFC)來實現,軟件也具有很好的擴展性。
CCNETConfig:這是程序的主線程,它起動與注冊表的連接,建立與CPageTab1, CPageTab2, and CPageTab3的關聯,然后利用屬性表生成模態對話框,CCNETConfig是獨立的。
CPropertySheet: CpropertySheet類基本上是空的,當你點擊不同的標簽時,MFC會處理不同的屬性頁,CpropertySheet也是獨立的。
CPageTab: CpageTab類包含了與各自標簽相關的代碼,它完成屬性頁上數據的保存,傳遞,校驗。
用戶界面
在默認狀態下,Embedded Tools軟件上傳應用程序到\Windows\Start Menu目錄下。如果你把應用程序上傳到\Windows\Start Menu\Settings目錄下,在文件夾中也可以找到圖標,如下圖所示。
這一結構程序具有三個屬性頁。CPageTab1處理的是與數據更新相關的任務,CpageTab2處理參數選擇相關的任務,CpageTab3傳送到cnet.com的任務。
從整體上看,程序并不是很復雜。程序員可以很容易地把代碼移植到諸如無線802.11b驅動程序上。
屬性頁面和其屬性
每一個類都有它的特有成員變量表,這些變量能夠通過MFC’s DDX保持編譯環境的設置。在每一屬性頁的OnInitDialog函數中都執行UpdateData(FALSE)事件,然后在OnKillActive事件中通過UpdateData(TRUE)校驗并把參數保存到注冊表。
當OnKillActive事件被觸發時程序就會把所有的信息保存到注冊表,即使在程序發生異常的時候。而函數OnInitDialog則是對程序進行了初始化。
通過利用資源編輯器,我建立了如圖D所示的三個屬性表。標題欄遵循了其他程序的設計標準,標題欄下面的文字也采用了其他程序的字體和顏色。
字體下面的直線是采用1bit位圖實現并當成一幅圖片,除此之外,我還添加了檢查框,靜態文本框,編輯框,組合框等。
自定義靜態文本框的字體和風格
為了獲取靜態文本框的合適字體,必需在CpageTab類中觸發WindowProc事件,而只要發送WM_CTLCOLORSTATIC消息就可以更換靜態文本框中的當前字體和字體的顏色了。
WM_CTLCOLORSTATIC把hDC和hWnd傳送到靜態文本框。
你可以看到,我使用了一個靜態變量來生成字體,然后重載這一指針變量就可以更改這些字體。如果你不想改變字體,即不要重載PropertyPages中的WindowProc事件,代碼的其他部分都會正常運行。
除了要生成合適的字體外,我還注重把界面設計成具有Windows CE系統專業的水平。
生成帶有屬性頁的屬性表
對于以上我生成的附帶屬性頁的屬性表,你一定會迷惑這一整個過程。我只是采用了MFC向導來自動生成四個獨立的類,其中一個是派生于CpropertySheet類,其他三個是派生于CpropertyPage類。在CWinApp::InitInstance事件中,我在屬性表中增加了屬性頁。
我還舉例說明了怎么樣從CPropertySheet 和 CpropertyPage而不是從CPropertySheet 和CpropertyPage派生出對象。
我初始化了所有的變量并把頁和表關聯起來,之后調用DoModal事件就可以生成模態對話框。
當InitInstance返回FALSE,MFC不再執行窗體消息循環。我可以通過使用CPropertySheet::Create()而不是使用CPropertySheet::DoModal()來生成一個非模態對話框。如果我這樣做,程序就返回TRUE,窗體消息循環就會進行。如果生成一個非模態對話框而返回FALSE,就會退出消息循環。
訪問注冊表
為了保存信息到注冊表中,程序必需執行CpageTab類中的OnInitDialog和OnKillActive事件。Listing C中的代碼說明了這一過程。
MFC能自動訪問注冊表,這一過程程序執行了GetProfileInt, GetProfileString, WriteProfileInt, 和 WriteProfileString函數。
我采用EMbedded Tools 3.0軟件中的Windows CE遠程注冊表編輯器來查看遠距離設備上的注冊表。
將鍵值保存在HKEY_CURRENT_USER\Software\CNET Networks, Inc\CNETConfig\etc…
你也應該注意到如何把關鍵字保存在HKEY_CURRENT_USER\Software\CNET Networks, Inc\CNETConfig\etc…下。
當采用MFC方式時,通常程序員都要調用
WriteProfileInt
WriteProfileString
GetProfileInt
GetProfileString
為了保存或恢復注冊表中程序的原內容,下面函數要在以下位置訪問注冊表:
HKEY_CURRENT_USER\Software\<company name>\<application name>\<section name>\<value name>。
軟件名稱通過SetRegistryKey來設置,各個部分名稱和其他一些變量可以由以上的四個函數來實現。
Unicode(統一的字符編碼標準)
在本文中所有的代碼中,你應該注意到TEXT都是在圓括號內出現的,這是因為Windows CE采用Unicode標準來編寫代碼。Unicode要本質上是采用每字符16位而不是每字符8位的方式。
程序中我也采用了L””來替代TEXT(“”),這一方法顯得更加方便,這也是采用了Unicode標準的字符串的原因。
結論
在編譯器提供的功能強大的幫助文獻下,我成功地編寫了一個Windows CE結構應用程序,程序可以訪問和保存變量到注冊表。程序的代碼很少,卻十分牢固,高效,并具有很好的擴展性。我也花了主要精力把界面盡可能地達到標準窗口的水準,我想這些對程序員的編程經歷有很大的幫助