windows API中CreateWindow()函數詳解

來源:互聯網
上載者:User

標籤: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);

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.