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

Windows SDK 筆記(二):視窗建立控制項完整指南與類別名稱大全

     編輯:關於VC++

控制項基本概念

控制項是子視窗,屬於系統預定義視窗類別,無需註冊、無需撰寫訊息處理函式。在主視窗 WM_CREATE 訊息中建立即可。

建立控制項標準範例

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            CreateWindow(TEXT("BUTTON"),        // 控制項類別名稱
                TEXT("按鈕(&A)"),
                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                10, 10, 100, 100,
                hwnd,
                (HMENU)1000,                    // 控制項 ID
                ((LPCREATESTRUCT)lParam)->hInstance,
                NULL);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return ::DefWindowProc(hwnd, message, wParam, lParam);
}

WM_CREATE 訊息參數詳解

lParam 指向 CREATESTRUCT 結構,包含視窗建立參數:

typedef struct tagCREATESTRUCT {
    LPVOID lpCreateParams;
    HINSTANCE hInstance;      // 實例控制代碼
    HMENU hMenu;
    HWND hwndParent;
    int cy, cx, y, x;
    LONG style;
    LPCTSTR lpszName;
    LPCTSTR lpszClass;
    DWORD dwExStyle;
} CREATESTRUCT, *LPCREATESTRUCT;

控制項與父視窗協作機制

1. 控制項通知父視窗:WM_COMMAND

  • HIWORD(wParam):通知代碼
  • LOWORD(wParam):控制項 ID
  • (HWND)lParam:控制項控制代碼

特定控制項另有專用通知訊息(如 WM_DRAWITEM)。

2. 父視窗控制控制項

記錄控制項控制代碼或透過 ID 取得(GetDlgItem),發送控制項專用訊息。

3. 參考文件位置

MSDN → Platform SDK → User Interface Services → Windows User Interface → Controls

控制項類別名稱完整參考表

1. 標準控制項

類別名稱控制項類型常用樣式
BUTTON按鈕BS_PUSHBUTTON, BS_CHECKBOX, BS_RADIOBUTTON, BS_GROUPBOX
COMBOBOX下拉式方塊CBS_DROPDOWN, CBS_DROPDOWNLIST, CBS_SIMPLE
EDIT編輯方塊ES_MULTILINE, ES_PASSWORD, ES_READONLY, ES_NUMBER
LISTBOX清單方塊LBS_MULTIPLESEL, LBS_HASSTRINGS, LBS_OWNERDRAWFIXED
RichEditRich Edit 1.0ES_MULTILINE, ES_RICHEDIT
RICHEDIT_CLASSRich Edit 2.0/3.0支援更多格式、Unicode
SCROLLBAR捲軸SBS_HORZ, SBS_VERT
STATIC靜態文字/圖片SS_LEFT, SS_CENTER, SS_BITMAP, SS_ICON

2. 通用控制項(需 InitCommonControlsEx 初始化)

INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_LISTVIEW_CLASSES;  // 或其他 ICC_* 旗標
InitCommonControlsEx(&icex);

HWND hWndListView = CreateWindowEx(0, WC_LISTVIEW,  // 無需引號
    TEXT(""),
    WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_ICON | LVS_EDITLABELS | WS_EX_CLIENTEDGE,
    10, 10, 100, 100,
    hwnd, (HMENU)1000,
    ((LPCREATESTRUCT)lParam)->hInstance, NULL);
類別名稱/巨集控制項所需 ICC 旗標
ANIMATE_CLASS動畫控制項ICC_ANIMATE_CLASS
DATETIMEPICK_CLASS日期時間選擇ICC_DATE_CLASSES
HOTKEY_CLASS熱鍵輸入ICC_HOTKEY_CLASS
MONTHCAL_CLASS月曆ICC_DATE_CLASSES
PROGRESS_CLASS進度條ICC_PROGRESS_CLASS
REBARCLASSNAME重新列ICC_COOL_CLASSES
STATUSCLASSNAME狀態列ICC_BAR_CLASSES
TOOLBARCLASSNAME工具列ICC_BAR_CLASSES
TOOLTIPS_CLASS工具提示ICC_TAB_CLASSES
TRACKBAR_CLASS軌跡條/滑桿ICC_BAR_CLASSES
UPDOWN_CLASS微調數字ICC_UPDOWN_CLASS
WC_COMBOBOXEX擴充下拉方塊ICC_USEREX_CLASSES
WC_HEADER標題控制項ICC_LISTVIEW_CLASSES
WC_IPADDRESSIP 位址輸入ICC_INTERNET_CLASSES
WC_LISTVIEW清單檢視ICC_LISTVIEW_CLASSES
WC_PAGESCROLLER頁面捲動器ICC_PAGESCROLLER_CLASS
WC_TABCONTROL分頁控制項ICC_TAB_CLASSES
WC_TREEVIEW樹狀檢視ICC_TREEVIEW_CLASSES

3. 特殊系統視窗類別

類別名稱用途
MDIClientMDI 客戶區視窗
ComboLBox下拉方塊內含的清單方塊
DDEMLEventDDEML 事件視窗 (NT/2000)
Message純訊息視窗 (Windows 2000+)
#32768功能表視窗
#32769桌面視窗
#32770對話方塊
#32771工作切換視窗
#32772圖示標題視窗 (NT/2000)

實用技巧:動態建立與配置控制項

// 執行期建立編輯方塊
HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", NULL,
    WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
    x, y, width, height, hwnd, (HMENU)IDC_EDIT1, hInst, NULL);

// 設定字型
SendMessage(hEdit, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);

// 設定提示文字 (Win7+)
SendMessage(hEdit, EM_SETCUEBANNER, TRUE, (LPARAM)L"請輸入關鍵字...");

常見錯誤避雷指南

  • 忘記 InitCommonControlsEx:通用控制項建立失敗、外觀異常
  • 控制項 ID 衝突:同一父視窗下 ID 必須唯一
  • WS_CHILD 遺漏:控制項不會隨父視窗移動/銷毀
  • Unicode/ANSI 不匹配:類別名稱與專案字元集設定需一致
  • 未處理 WM_GETMINMAXINFO:包含控制項的視窗最小化異常
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved