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

Windows SDK 筆記(六):對話方塊資源建立主視窗與自訂控制項技術

     編輯:關於VC++

第一部分:使用對話方塊資源建立主視窗

核心概念

Charles Petzold 著作中介紹的技巧:直接利用對話方塊資源建立主視窗,可方便安排子控制項,其餘程式碼與普通視窗相同。對話方塊是系統預定義「視窗類別」,有自己的視窗處理函式,我們撰寫的對話方塊處理函式並非真正的視窗訊息處理函式。但可在對話方塊模板腳本中指定使用自訂視窗類別而非系統對話方塊類別,將對話方塊訊息處理「嫁接」為自訂處理函式。

實作步驟

  1. 撰寫真正的視窗訊息處理函式:遵循普通視窗方式,勿漏 DefWindowProc
  2. 註冊視窗類別:使用自訂處理函式註冊類別
  3. 建立對話方塊資源腳本:手工撰寫 .dlg 檔案,指定 CLASS 為自訂類別名稱
  4. 包含資源腳本:View → Resource Includes,在 Compile-time directives 欄填入檔名
  5. 使用非模式對話方塊方式建立主視窗:呼叫 CreateDialog

對話方塊資源腳本範例

HexCalc 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);

其他部分(註冊類別、訊息迴路等)與普通視窗完全相同。

第二部分:在對話方塊中建立自訂子視窗控制項

1. 定義自訂視窗類別與訊息處理函式

在 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 處理函式。

2. 在對話方塊模板中加入自訂控制項

在對話方塊編輯器放置 "Custom Control",設定屬性並填入自訂類別名稱 SomeControl。

技術要點總結

技術關鍵點適用場景
對話方塊資源建主視窗CLASS 指定自訂類別;CreateDialog 建立;保留標準訊息迴路控制項佈局複雜、需快速開發主視窗
對話方塊嵌入自訂控制項註冊獨立視窗類別;Custom Control 指定類別名稱需特殊繪製/行為的控制項、複合控制項

進階應用提示

  • 子類別化:對現有控制項進行 SetWindowLong(GWL_WNDPROC) 替換處理函式
  • ActiveX 控制項:更完整的封裝,支援屬性頁、事件、持久化
  • 視窗子類別化 vs 超類別化:前者修改現有實例,後者建立新類別繼承系統類別行為
  • DPI 感知:高解析度顯示器下的座標縮放處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved