標籤:style color 使用 strong io ar 應用 size
CreateWindow函數詳解
在註冊完視窗類別後就需要進行視窗的建立,用到的函數理所當然就是CreateWindow(), 而這個函數是基於視窗類別的,所以還需要指定幾個參數來制定特定的視窗。而且像一些不帶邊框的視窗是怎麼建立的也是具有相當的技巧的,就是建立的是不帶標題和邊框的視窗,然後自己在客戶區繪製程式的內容,能夠製作個人化的應用程式。
API解釋
該函數建立一個重疊式視窗、彈出式視窗或子視窗。它指定視窗類別,視窗標題,視窗風格,以及視窗的初始位置及大小(可選的)。函數也指該視窗的父視窗或所屬視窗(如果存在的話),及視窗的菜單。
若要使用除 CreateWindow 函數支援的風格外的擴充風格,則使用 CreateWindowEx 函數代替 CreateWindow 函數。
API 函數原型:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTRlpClassName, // 視窗類別名稱
_In_opt_ LPCTSTRlpWindowName, // 視窗標題
_In_ DWORD dwStyle, // 視窗風格,或稱視窗格式
_In_ int x, // 初始 x 座標
_In_ int y, // 初始 y 座標
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWNDhWndParent, // 父視窗控制代碼
_In_opt_ HMENUhMenu, // 視窗菜單控制代碼
_In_opt_ HINSTANCEhInstance, // 程式執行個體控制代碼
_In_opt_ LPVOIDlpParam // 建立參數
);
註:_In_ 說明該參數是輸入的,_opt_ 說明該參數是選擇性參數(不是說沒有參數,而是可以利用宏搭配參數)。
參數解析:
參數 |
含義 |
lpClassName |
1. 視窗類別名稱,可以是一個指向 NULL 結束的字串或一個整型數值 2. 如果是字串,它指定了視窗的類名。這個類名可以是任何用函數 RegisterClass 註冊的類名,或是任何預定義的控制類名 3. 如是一個整型量,它是由此前調用 theGlobalAddAtom 函數產生的全域量。這個小於 0xC000 的 16 位元必須是 lpClassName 參數位低 16 位,該參數的高位必須是 0 |
lpWindowName |
1. 視窗標題,一個指向 NULL 結束的字串指標 2. 如果視窗風格指定了標題條,由 lpWindowName 指向的視窗標題將顯示在標題條上 3. 當使用 Createwindow 函數來建立控制例如按鈕,選擇框和靜態控制時,可使用 lpWindowName 來指定控制文本 |
dwStyle |
指定建立視窗的風格(詳見下方↓) |
x |
1. 指定視窗的初始水平位置(x 座標) 2. 對一個層疊或彈出式視窗,x 參數是螢幕座標系的視窗的左上方的初始 x 座標 3. 對於子視窗,x 是子視窗左上方相對父視窗客戶區左上方的初始 x 座標 4. 如果該參數被設為 CW_USEDEFAULT 則系統為視窗選擇預設的左上方座標並忽略 y 參數,CW_USEDEFAULT 只對層疊視窗有效,如果為彈出式視窗或子視窗設定,則 x 和 y 參數被設為零。 |
y |
1. 指定視窗的初始垂直位置(y 座標) 2. 對一個層疊或彈出式視窗,y 參數是螢幕座標系的視窗的左上方的初始 y 座標 3. 對於子視窗,y 是子視窗左上方相對父視窗客戶區左上方的初始 y 座標 4. 對於列表框,y 是列表框客戶區左上方相對父視窗客戶區左上方的初始 y 座標 5. 如果層疊視窗是使用 WS_VISIBLE 風格位建立的並且 x 參數被設為 CW_USEDEFAULT,則系統將忽略 y 參數 |
nWidth |
1. 以裝置單元指明視窗的寬度 2. 對於層疊視窗,nWidth 的值或是螢幕座標的視窗寬度或是 CW_USEDEFAULT 3. 若 nWidth 是 CW_USEDEFAULT,則系統為視窗選擇一個預設的高度和寬度(預設寬度為從初始 x 座標開始到螢幕的右邊界,預設高度為從初始 y 座標開始到目的地區域的頂部。),CW_USEDEFAULT 只對層疊視窗有效,如果為彈出式視窗和子視窗設定 CW_USEDEFAULT 標誌則 nWidth 和 nHeight 被設為零 |
nHeight |
1. 以裝置單元指明視窗的高度 2. 對於層疊視窗,nHeight 是螢幕座標的視窗寬度 3. 若 nWidth 被設為 CW_USEDEFAULT,則系統忽略 nHeight 參數,自動為 nWidth 和 nHeight 設定預設參數 |
hWndParent |
1. 指向被建立視窗的父視窗或所有者視窗的控制代碼 2. 若要建立一個子視窗或一個從屬視窗,需提供一個有效視窗控制代碼 3. 建立一個單純的訊息視窗,可以提供 HWND_MESSAGE 或提供一個己存在的訊息視窗的控制代碼 |
hMenu |
1. 指向視窗菜單控制代碼,或依據視窗風格指明一個子視窗標識 2. 對於層疊或彈出式視窗,hMenu 指定視窗使用的菜單:如果使用了菜單類,則 hMenu 可以為 NULL 3. 對於子視窗,hMenu 指定了該子視窗標識(一個整型量),一個對話方塊使用這個整型值將事件通知父類。應用程式確定子視窗標識,這個值對於相同父視窗的所有子視窗必須是唯一的 |
hInstance |
與視窗相關聯的模組執行個體的控制代碼 |
lpParam |
1. 指向一個值的指標,該值傳遞給視窗 WM_CREATE 訊息。該值通過在 IParam 參數中的 CREATESTRUCT 結構傳遞 2. 如果應用程式調用 CreateWindow 建立一個 MDI 客戶視窗,則 lpParam 必須指向一個 CLIENTCREATESTRUCT 結構 |
dwStyle 視窗風格解析
視窗風格 |
含義 |
WS_BORDER |
建立一個帶邊框的視窗 |
WS_CAPTION |
建立一個有標題框的視窗(包含了 WS_BODER 風格) |
WS_CHILD |
建立一個子視窗,這個風格的視窗不能擁有菜單也不能與 WS_POPUP 風格合用 |
WS_CHILDWINDOW |
與 WS_CHILD 相同 |
WS_CLIPCHILDREN |
當在父視窗內繪圖時,排除子視窗地區,在建立父視窗時使用這個風格 |
WS_CLIPSIBLINGS |
1. 排除子視窗之間的相對地區,也就是,當一個特定的視窗接收到 WM_PAINT 訊息時,WS_CLIPSIBLINGS 風格將所有層疊視窗排除在繪圖之外,只重繪指定的子視窗 2. 如果未指定該風格,並且子視窗是層疊的,則在重繪子視窗的客戶區時,就會重繪鄰近的子視窗 |
WS_DISABLED |
1. 建立一個初始狀態為禁止的子視窗,一個禁止狀態的視窗不能接受來自使用者的輸入資訊 2. 在視窗建立之後,可以調用 EnableWindow 函數來啟用該視窗 |
WS_DLGFRAME |
建立一個帶對話方塊邊框風格的視窗,這種風格的視窗不能帶標題條 |
WS_GROUP |
1. 指定一組“控制視窗”的第一個“控制視窗” 2. 這個“控制視窗”組由第一個“控制視窗”和隨後定義的“控制視窗”組成,自第二個“控制視窗”開始每個“控制視窗”具有 WS_GROUP 風格 3. 每個組的第一個“控制視窗”帶有 WS_TABSTOP 風格,從而使使用者可以在組間移動 4. 使用者隨後可以使用游標在組內的控制間改變鍵盤焦點 |
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 鍵時可以獲得鍵盤焦點。 2. 按下 Tab 鍵後使鍵盤焦點轉移到下一具有 WS_TABSTOP 風格的“控制視窗” |
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);