1. 程式人生 > WINDOWS開發 >WINDOWS API中CREATEWINDOW()函式詳解(轉載)*

WINDOWS API中CREATEWINDOW()函式詳解(轉載)*

原文 https://www.cnblogs.com/jjmcu/p/3881441.html

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 結束的字串或一個整型數值
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,

NULL,

hInstance,

NULL);

二 建立使用者不可操作的win32程式

hwnd = CreateWindow(szAppName,

WS_DISABLED,// 修改為失能引數

CW_USEDEFAULT,

NULL);

三 使用彈出式視窗建立不帶邊框和標題欄的視窗

hwnd = CreateWindow(szAppName,

WS_POPUP,// 彈出式視窗,並且要修改長寬

CW_USEDEFAULT,

NULL);

四 帶邊框的彈出式視窗

hwnd = CreateWindow(szAppName,

WS_POPUP | WS_SIZEBOX,

NULL);