首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 程式設計師 WTL 指南 (5):對話框與控件封裝、DDX、訊息反射完整實戰

     編輯:關於VC++

WTL(Windows Template Library)提供輕量級、高效能的 MFC 替代方案。本章聚焦對話框架構、控件封裝類別、對話框資料交換(DDX)與通知訊息反射機制,透過 ControlMania1 範例專案逐步建構功能完整的對話框應用程式。

WTL 對話框基礎

  • CDialogImpl:模態/非模態對話框基底類別,需宣告 IDD 靜態成員對應資源 ID。
  • CAxDialogImpl:支援 ActiveX 控件的對話框基底。
  • _tWinMain:初始化 COM、AtlInitCommonControls、_Module,建立主對話框呼叫 DoModal(),結束時按相反順序釋放。

控件封裝類別

WTL 提供與 MFC 同名或相似的封裝類別,繼承自 CWindow,封裝 HWND 並對應訊息宏:

  • 基本控件:CStatic, CButton, CListBox, CComboBox, CEdit, CScrollBar
  • 通用控件:CListViewCtrl (MFC CListCtrl), CTreeViewCtrl (CTreeCtrl), CToolBarCtrl, CStatusBarCtrl, CTabCtrl, CToolTipCtrl, CTrackBarCtrl (CSliderCtrl), CUpDownCtrl (CSpinButtonCtrl), CProgressBarCtrl, CHotKeyCtrl, CAnimateCtrl, CRichEditCtrl, CReBarCtrl, CComboBoxEx, CDateTimePickerCtrl, CMonthCalendarCtrl, CIPAddressCtrl
  • WTL 專有:CBitmapButton, CCheckListViewCtrl, CTreeViewCtrlEx/CTreeItem, CHyperLink, CPagerCtrl, CFlatScrollBar, CLinkCtrl (XP+)。

多數類別為輕量封裝,建構/解構不建立/銷毀實際視窗,僅關聯既有 HWND。

三種控件關聯方式

  1. CWindow 直接關聯:CListViewCtrl wnd(hwnd)、Attach(hwnd)、operator=,適合暫時使用,作用域結束自動釋放關聯。
  2. CContainedWindow:子類化控件,訊息導向父視窗 ALT_MSG_MAP 區段處理,無需為每個控件建立獨立類別。四步驟:成員宣告 → ALT_MSG_MAP 加入訊息映射 → 建構函數指定區段號 → OnInitDialog 呼叫 SubclassWindow。
  3. CWindowImpl 派生類別:完整子類化,訊息內部處理。宣告 class CButtonImpl : public CWindowImpl<CButtonImpl, CButton>,成員變數型別為該類別,OnInitDialog 呼叫 SubclassWindow。

WTL DDX(對話框資料交換)

繼承 CWinDataExchange,宣告 BEGIN_DDX_MAP 區塊,支援六大宏:

  • DDX_TEXT:字串 ↔ 編輯框(CString, BSTR, 靜態陣列)。
  • DDX_INT/DDX_UINT/DDX_FLOAT:數值 ↔ 編輯框(_ATL_USE_DDX_FLOAT 需預定義)。
  • DDX_CHECK:核取方塊狀態 ↔ int (0/1/2)。
  • DDX_RADIO:單選群組 ↔ int。
  • DDX_CONTROL:控件 ↔ 封裝變數(自動子類化)。

DoDataExchange(BOOL bSaveAndValidate):TRUE 為控件→變數(驗證),FALSE 為變數→控件(初始化),預設 FALSE(與 MFC 相反)。錯誤觸發 OnDataExchangeError 可覆寫自訂處理。

通知訊息處理與反射

  • 父視窗處理:使用 COMMAND_HANDLER_EX, NOTIFY_HANDLER_EX 等宏(需 BEGIN_MSG_MAP_EX + atlcrack.h),處理函式原型 void(UINT, int, HWND) 或 LRESULT(NMHDR*)。
  • 反射至控件:父視窗映射加入 REFLECT_NOTIFICATIONS(),控件類別內用 MSG_OCM_* 宏(如 MSG_OCM_DRAWITEM, REFLECTED_NOTIFY_CODE_HANDLER_EX)處理,並加 DEFAULT_REFLECTION_HANDLER() 確保未處理訊息交給 DefWindowProc。
  • 可反射訊息:WM_COMMAND, WM_NOTIFY, WM_PARENTNOTIFY, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_VKEYTOITEM, WM_CHARTOITEM, WM_HSCROLL, WM_VSCROLL, WM_CTLCOLOR*。

常見坑點

  • 對話框字體:VC6 資源檔預設 MS Sans Serif,需手動改為 DIALOGEX + DS_SHELLFONT + MS Shell Dlg 才能在 Win2000/XP 使用 Tahoma,每次儲存資源需重複修改。
  • _ATL_MIN_CRT:Release 預設啟用最小 CRT 優化,若使用 CString、DDX 浮點等 CRT 功能需關閉此定義。

下一章將介紹 DDV(資料驗證)、新控件封裝與自繪/自定外觀等進階 UI 技術。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved