CreateWindow函數詳解
在注冊完窗口類后就需要進行窗口的創建,用到的函數理所當然就是CreateWindow(), 而這個函數是基於窗口類的,所以還需要指定幾個參數來制定特定的窗口。而且像一些不帶邊框的窗口是怎么創建的也是具有相當的技巧的,就是創建的是不帶標題和邊框的窗口,然后自己在客戶區繪制程序的內容,能夠制作個性化的應用程序。
API解釋
該函數創建一個重疊式窗口、彈出式窗口或子窗口。它指定窗口類,窗口標題,窗口風格,以及窗口的初始位置及大小(可選的)。函數也指該窗口的父窗口或所屬窗口(如果存在的話),及窗口的菜單。
若要使用除 CreateWindow 函數支持的風格外的擴展風格,則使用 CreateWindowEx 函數代替 CreateWindow 函數。
API 函數原型:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, // 窗口類名稱
_In_opt_ LPCTSTR lpWindowName, // 窗口標題
_In_ DWORD dwStyle, // 窗口風格,或稱窗口格式
_In_ int x, // 初始 x 坐標
_In_ int y, // 初始 y 坐標
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜單句柄
_In_opt_ HINSTANCE hInstance, // 程序實例句柄
_In_opt_ LPVOID lpParam // 創建參數
);
注:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數(不是說沒有參數,而是可以利用宏搭配參數)。
參數解析:
參數 |
含義 |
lpClassName |
1. 窗口類名稱,可以是一個指向 NULL 結束的字符串或一個整型數值 |
lpWindowName |
1. 窗口標題,一個指向 NULL 結束的字符串指針 |
dwStyle |
指定創建窗口的風格(詳見下方↓) |
x |
1. 指定窗口的初始水平位置(x 坐標) |
y |
1. 指定窗口的初始垂直位置(y 坐標) |
nWidth |
1. 以設備單元指明窗口的寬度 |
nHeight |
1. 以設備單元指明窗口的高度 |
hWndParent |
1. 指向被創建窗口的父窗口或所有者窗口的句柄 |
hMenu |
1. 指向窗口菜單句柄,或依據窗口風格指明一個子窗口標識 |
hInstance |
與窗口相關聯的模塊實例的句柄 |
lpParam |
1. 指向一個值的指針,該值傳遞給窗口 WM_CREATE 消息。該值通過在 IParam 參數中的 CREATESTRUCT 結構傳遞 |
dwStyle 窗口風格解析
窗口風格 |
含義 |
WS_BORDER |
創建一個帶邊框的窗口 |
WS_CAPTION |
創建一個有標題框的窗口(包含了 WS_BODER 風格) |
WS_CHILD |
創建一個子窗口,這個風格的窗口不能擁有菜單也不能與 WS_POPUP 風格合用 |
WS_CHILDWINDOW |
與 WS_CHILD 相同 |
WS_CLIPCHILDREN |
當在父窗口內繪圖時,排除子窗口區域,在創建父窗口時使用這個風格 |
WS_CLIPSIBLINGS |
1. 排除子窗口之間的相對區域,也就是,當一個特定的窗口接收到 WM_PAINT 消息時,WS_CLIPSIBLINGS 風格將所有層疊窗口排除在繪圖之外,只重繪指定的子窗口 |
WS_DISABLED |
1. 創建一個初始狀態為禁止的子窗口,一個禁止狀態的窗口不能接受來自用戶的輸入信息 |
WS_DLGFRAME |
創建一個帶對話框邊框風格的窗口,這種風格的窗口不能帶標題條 |
WS_GROUP |
1. 指定一組“控制窗口”的第一個“控制窗口” |
WS_HSCROLL |
創建一個有水平滾動條的窗口 |
WS_ICONIC |
創建一個初始狀態為最小化狀態的窗口,與 WS_MINIMIZE 風格相同 |
WS_MAXIMIZE |
創建一個初始狀態為最大化狀態的窗口 |
WS_MAXIMIZEBOX |
創建一個具有最大化按鈕的窗口,該風格不能與 WS_EX_CONTEXTHELP 風格同時出現,同時必須指定 WS_SYSMENU 風格 |
WS_MINIMIZE |
創建一個初始狀態為最小化狀態的窗口,與 WS_ICONIC 風格相同 |
WS_MINIMIZEBOX |
創建一個具有最小化按鈕的窗口,該風格不能與 WS_EX_CONTEXTHELP 風格同時出現,同時必須指定 WS_SYSMENU 風格 |
WS_OVERLAPPED |
產生一個層疊的窗口,一個層疊的窗口有一個標題條和一個邊框,與 WS_TILED 風格相同 |
WS_OVERLAPPEDWINDOW |
相當於(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),與 WS_TILEDWINDOW 風格相同 |
WS_POPUP |
創建一個彈出式窗口,該風格不能與 WS_CHILD 風格同時使用。 |
WS_POPUPWINDOW |
相當於(WS_POPUP | WS_BORDER | WS_SYSMENU),但 WS_CAPTION 和 WS_POPUPWINDOW 必須同時設定才能使窗口某單可見 |
WS_SIZEBOX |
創建一個可調邊框的窗口,與 WS_THICKFRAME 風格相同 |
WS_SYSMENU |
創建一個在標題條上帶有窗口菜單的窗口,必須同時設定 WS_CAPTION 風格 |
WS_TABSTOP |
1. 創建一個“控制窗口”,在用戶按下 Tab 鍵時可以獲得鍵盤焦點。 |
WS_THICKFRAME |
創建一個具有可調邊框的窗口,與 WS_SIZEBOX 風格相同 |
WS_TILED |
產生一個層疊的窗口,一個層疊的窗口有一個標題和一個邊框,與 WS_OVERLAPPED 風格相同 |
WS_TILEDWINDOW |
相當於(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),與 WS_OVERLAPPEDWINDOW 風格相同 |
WS_VISIBLE |
創建一個初始狀態為可見的窗口 |
WS_VSCROLL |
創建一個有垂直滾動條的窗口 |
返回值:
1. 如果函數成功,返回值為新窗口的句柄。
2. 如果函數失敗,返回值為 NULL。
應用舉例
一 創建帶垂直滾動條和水平滾動條的窗口程序
hwnd = CreateWindow(szAppName,
TEXT("垂直和水平滾動條"),
WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, // | 上兩參數即可
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
二 創建用戶不可操作的win32程序
hwnd = CreateWindow(szAppName,
TEXT("垂直和水平滾動條"),
WS_DISABLED, // 修改為失能參數
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
三 使用彈出式窗口創建不帶邊框和標題欄的窗口
hwnd = CreateWindow(szAppName,
TEXT("垂直和水平滾動條"),
WS_POPUP, // 彈出式窗口,並且要修改長寬
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
四 帶邊框的彈出式窗口
hwnd = CreateWindow(szAppName,
TEXT("垂直和水平滾動條"),
WS_POPUP | WS_SIZEBOX, // 彈出式窗口,並且要修改長寬
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);