控制項是子視窗,屬於系統預定義視窗類別,無需註冊、無需撰寫訊息處理函式。在主視窗 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);
}
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;
HIWORD(wParam):通知代碼LOWORD(wParam):控制項 ID(HWND)lParam:控制項控制代碼特定控制項另有專用通知訊息(如 WM_DRAWITEM)。
記錄控制項控制代碼或透過 ID 取得(GetDlgItem),發送控制項專用訊息。
MSDN → Platform SDK → User Interface Services → Windows User Interface → Controls
| 類別名稱 | 控制項類型 | 常用樣式 |
|---|---|---|
| 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 |
| RichEdit | Rich Edit 1.0 | ES_MULTILINE, ES_RICHEDIT |
| RICHEDIT_CLASS | Rich Edit 2.0/3.0 | 支援更多格式、Unicode |
| SCROLLBAR | 捲軸 | SBS_HORZ, SBS_VERT |
| STATIC | 靜態文字/圖片 | SS_LEFT, SS_CENTER, SS_BITMAP, SS_ICON |
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_IPADDRESS | IP 位址輸入 | ICC_INTERNET_CLASSES |
| WC_LISTVIEW | 清單檢視 | ICC_LISTVIEW_CLASSES |
| WC_PAGESCROLLER | 頁面捲動器 | ICC_PAGESCROLLER_CLASS |
| WC_TABCONTROL | 分頁控制項 | ICC_TAB_CLASSES |
| WC_TREEVIEW | 樹狀檢視 | ICC_TREEVIEW_CLASSES |
| 類別名稱 | 用途 |
|---|---|
| MDIClient | MDI 客戶區視窗 |
| ComboLBox | 下拉方塊內含的清單方塊 |
| DDEMLEvent | DDEML 事件視窗 (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"請輸入關鍵字...");