WTL體系結構(4) (轉)

worldblog發表於2008-01-31
WTL體系結構(4) (轉)[@more@]

WTL體系結構

對話方塊

ATL的對話方塊支援一向很好,對此WTL新增了通用對話方塊的封裝. 本質上是為對話方塊加入了輸入驗證和回撥. 比如, 你想在改變年Open對話方塊中的夾時有所動作,那麼你應該從CFileDialogImpl<>繼承一個類,實現OnFolderChange():

class CMyFileDialog : public CFileDialogImpl
{
public:
  CMyFileDialog(BOOL b)
  : CFileDialogImpl(b) { }
  void OnFolderChange(LPOFNOTIFY lpon)
  {
  char strFolder[MAX_PATH];
  if (GetFolderPath(strFolder, sizeof(strFolder)) > 0)
  {
  MessageBox(strFolder);
  }
  }
};

當資料夾的路徑改變時,CFileDialogImpl<>OnFolderChange().該函式使用基類的GetFolderPath(),來取得新路徑.



WTL為所有的和通用控制元件提供了封裝類,包括 2000新加入的. 雖然只是簡單的包裝,但是它們使這些控制元件更加容易訪問.譬如,你能記清楚從List View讀出當前選定項的文字的訊息和需要傳的引數嗎?(實際上, 你需要傳送兩個訊息, 一個是得到選定項的,另一個是讀出它的文字.) WTL的作者為你完成了這些煩人的工作, 提供了一個簡單的封裝函式供你使用.

使用這些控制元件類有兩種方法. 如果你的對話方塊裡有一個控制元件, 你可以將控制元件的HWND依附到一個封裝,使用封裝類的方法來訪問控制元件.這種方法簡化了你讀寫控制元件資料和處理notification訊息的程式碼.

另外的用法是把這些類加到你的檢視類的繼承層次中去:

class CMyView : public CWindowImpl

這表示CWindowImpl<>是從CListBox繼承而來,因此建立的視窗將是一個list box (因為視窗類的名字是透過呼叫
CListBox::GetWndClassName()得到的). 另外, ATL的視窗機制會子類化這個視窗,將發給它的訊息到你的訊息對映中去. 它保留了老的視窗函式,這樣,你沒有處理的訊息將由老的視窗函式來處理.當你的檢視類從控制元件類繼承時,WTL就會使用這一技術.

在notification訊息和子類化這個主題上,有一點很值得指出,那就是當某事件發生時,絕大多數視窗控制元件都會傳送notification訊息給它們的父視窗.讓你視窗來處理這些notification訊息要比子類化一個已存在控制元件視窗(或子類化一個已存在的類,然後建立一個例項),從而在控制元件之前取得訊息好得多. 譬如, 你想處理按鈕的click事件,你所需要做的只是處理BN_CLICKED notification.它將由按鈕傳送給你的視窗類.另外的一種方法是從CContainedWindow<>子類化BUTTON視窗來處理click訊息.

我之所以說這個是因為一個知名的ATL鼓吹者給我一份程式碼裡就是這麼做的.他的程式碼取得一個簡單的按鈕click事件所花的時間是別人的3到4倍,因為他子類化了按鈕控制元件,而不是簡單的處理BN_CLICKED notification.

WTL還提供了一些新的控制元件,在win32中沒有對等者. 你已經看到過一個 -- command bar, 實際上還有其他一些非常有用類:

類  描述 CBitmapButton 這是一個用點陣圖替代標題的按鈕.你可以提供一個image list,裡邊包含按鈕在正常狀態,失效, 推入和滑鼠落在按鈕上的圖表. CHyink 讓你建立一個static控制元件,它代表一個hyperlink,這樣當使用者點選它時,預設的開啟該連結. CWaitCursor 這不過是在它的建構函式中把滑鼠圖示改成等待狀態,而在解構函式中還原. CCheckListViewCtrl 在每一項邊上都有一個check box的list box. CMultiPaneStatarCtrl 具有多個pane的狀態條

(未完待續)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998963/,如需轉載,請註明出處,否則將追究法律責任。

相關文章