WTL(Windows Template Library)提供輕量級、高效能的 MFC 替代方案。本章聚焦對話框架構、控件封裝類別、對話框資料交換(DDX)與通知訊息反射機制,透過 ControlMania1 範例專案逐步建構功能完整的對話框應用程式。
IDD 靜態成員對應資源 ID。AtlInitCommonControls、_Module,建立主對話框呼叫 DoModal(),結束時按相反順序釋放。WTL 提供與 MFC 同名或相似的封裝類別,繼承自 CWindow,封裝 HWND 並對應訊息宏:
CStatic, CButton, CListBox, CComboBox, CEdit, CScrollBarCListViewCtrl (MFC CListCtrl), CTreeViewCtrl (CTreeCtrl), CToolBarCtrl, CStatusBarCtrl, CTabCtrl, CToolTipCtrl, CTrackBarCtrl (CSliderCtrl), CUpDownCtrl (CSpinButtonCtrl), CProgressBarCtrl, CHotKeyCtrl, CAnimateCtrl, CRichEditCtrl, CReBarCtrl, CComboBoxEx, CDateTimePickerCtrl, CMonthCalendarCtrl, CIPAddressCtrlCBitmapButton, CCheckListViewCtrl, CTreeViewCtrlEx/CTreeItem, CHyperLink, CPagerCtrl, CFlatScrollBar, CLinkCtrl (XP+)。多數類別為輕量封裝,建構/解構不建立/銷毀實際視窗,僅關聯既有 HWND。
CListViewCtrl wnd(hwnd)、Attach(hwnd)、operator=,適合暫時使用,作用域結束自動釋放關聯。ALT_MSG_MAP 區段處理,無需為每個控件建立獨立類別。四步驟:成員宣告 → ALT_MSG_MAP 加入訊息映射 → 建構函數指定區段號 → OnInitDialog 呼叫 SubclassWindow。class CButtonImpl : public CWindowImpl<CButtonImpl, CButton>,成員變數型別為該類別,OnInitDialog 呼叫 SubclassWindow。繼承 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*。MS Sans Serif,需手動改為 DIALOGEX + DS_SHELLFONT + MS Shell Dlg 才能在 Win2000/XP 使用 Tahoma,每次儲存資源需重複修改。CString、DDX 浮點等 CRT 功能需關閉此定義。下一章將介紹 DDV(資料驗證)、新控件封裝與自繪/自定外觀等進階 UI 技術。