windows API中CreateWindow()函數詳解


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,

    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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM