Charles Petzold 著作中介紹的技巧:直接利用對話方塊資源建立主視窗,可方便安排子控制項,其餘程式碼與普通視窗相同。對話方塊是系統預定義「視窗類別」,有自己的視窗處理函式,我們撰寫的對話方塊處理函式並非真正的視窗訊息處理函式。但可在對話方塊模板腳本中指定使用自訂視窗類別而非系統對話方塊類別,將對話方塊訊息處理「嫁接」為自訂處理函式。
DefWindowProc.dlg 檔案,指定 CLASS 為自訂類別名稱View → Resource Includes,在 Compile-time directives 欄填入檔名CreateDialogHexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc" // 填入自訂註冊類別名稱
CAPTION "Hex Calculator"
{
PUSHBUTTON "D", 68, 8, 24, 14, 14
PUSHBUTTON "A", 65, 8, 40, 14, 14
// 其他控制項...
}
hwnd = CreateDialog(
hInstance,
szAppName, // 對話方塊模板名稱
0,
NULL);
ShowWindow(hwnd, iCmdShow);
其他部分(註冊類別、訊息迴路等)與普通視窗完全相同。
在 WinMain 中除註冊主視窗類別外,額外註冊對話方塊用控制項類別:
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = SomeWndProc; // 對應訊息處理函式
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("SomeControl");
RegisterClass(&wndclass);
同時撰寫對應的 SomeWndProc 處理函式。
在對話方塊編輯器放置 "Custom Control",設定屬性並填入自訂類別名稱 SomeControl。
| 技術 | 關鍵點 | 適用場景 |
|---|---|---|
| 對話方塊資源建主視窗 | CLASS 指定自訂類別;CreateDialog 建立;保留標準訊息迴路 | 控制項佈局複雜、需快速開發主視窗 |
| 對話方塊嵌入自訂控制項 | 註冊獨立視窗類別;Custom Control 指定類別名稱 | 需特殊繪製/行為的控制項、複合控制項 |
SetWindowLong(GWL_WNDPROC) 替換處理函式