Win32應用程序基礎——WNDCLASSEX窗口類。

有了主函數,程序即可以運行了,程序首先找到WinMain入口,而後開始執行,可是注意,此時尚未任何的動做,因此此時的程序運行以後沒有任何現象。函數

也許不少人預想的是,運行一個界面,上面顯示一個Hello world。畢竟咱們在控制檯程序中也是這麼過來的。那麼咱們接下來要作的就是「構造」一個窗口。spa

說到底咱們的程序是一個系統調用,因此咱們直接向操做系統請求構造窗口,而且要交給操做系統一些和窗口相關的參數,這樣,操做系統就能按咱們預想的那樣構造窗口了。操作系統

天然地,這些咱們邏輯上看起來的參數,實際上對操做系統而言就是一堆的數據,系統存儲該數據並在須要的時候調用。咱們把這些參數打包,夠形成一個結構體,在C++中這個結構體就是WNDCLASSEX窗口類。指針

WNDCLASSEX的生命以下:對象

typedef struct WNDCLASSEX { 繼承

  UINT cbSize; 進程

  UINT style; 內存

  WNDPROC lpfnWndProc; 回調函數

  int cbClsExtra; 編譯

  int cbWndExtra;

  HINSTANCE hInstance;

  HICON hIcon;

  HCURSOR hCursor;

  HBRUSH hbrBackground;

  LPCTSTR lpszMenuName;

  LPCTSTR lpszClassName;

  HICON hIconSm;

  } WNDCLASSEX, *PWNDCLASSEX;

每一個窗口都是由以上十二個成員參數定義的,不一樣的組合產生了不一樣的窗口,這種定義方式是Win系統中最基礎的定義,不像C#那樣直接來一個繼承就能夠給你產生一個窗口,因此天然地他要麻煩一些,不過絕對很靈活。

不要被這十二個看不懂的成員嚇到,分別解釋,其實也不是很難。

第一個:UINT cbSize UINT是Win32中定義的一個宏,其實就是一個32位無符號整數。#define UINT nusigned int   這個變量存儲了該結構體的大小賦值時,咱們可使用sizeof(WNDCLASSEX)

第二個:UINT style  這個變量能夠定義窗口的風格,style 雖然是一個無符號整數,可是他的取值,是系統定義好的一組宏變量:

CS_HREDRAW 若移動或改變了窗口寬度,則刷新整個窗口
CS_VREDRAW
若移動或改變了窗口高度,則刷新整個窗口
CS_OWNDC
爲該類中的每一個窗口分配一個單值的設備描述表
CS_DBLCLKS
當用戶雙擊鼠標時向窗口程序發送一個雙擊的信息,同時,光標位於屬 於該類的窗口中
CS_PARENTDC

CS_NOCLOSE
禁止系統菜單上的關閉命令
CS_SAVEBITS

可使用or 將不一樣的style鏈接起來。

第三個:WNDPROC lpfnWndProc 這個應該是該結構中最重要的一個成員,類型WNDPROC的實質是一個指向函數的長整類型的指針。  也就是說咱們定義一個窗口,當鼠標在該窗口上操做,或鍵盤按鍵時,該窗口收到了這個消息。此時他的lpfnWndProc指向一個回調函數,(回調函數見下方講解)該窗口將參數送到回調函數,由回調函數執行動做,以後則能夠對動做做出相應。

第四個:int cbClsExtra 給類而外預留的空間默認設爲0 當你須要的時候天然會明白它的用處。 

第五個:int cbWndExtra 同上 

第六個:HINSTANCE hInstance    該窗口的句柄

第七個:HICON hIcon  該窗口的圖標的句柄

第八個:HCURSOR hCursor  該窗口光標形式的句柄

第九個:HBRUSH hbrBackground  該窗口畫刷的句柄(一邊以H開頭的都是句柄)

第十個:LPCTSTR lpszMenuName  

先介紹一下該變量 LPCTSTR 他比LPSTR 多了一個C一個T C表明這是一個const T表明支持_T宏命令。實際他就是一個指向String的const指針。這個變量指向其菜單的名字。

十一個:LPCTSTR lpszClassName該類的名字。即給該類起一個名字。

十二個:HICON hIconSm這個圖標顯示的是窗口在任務欄處顯示的圖標。

就這樣十二個成員介紹完了,關於回調函數能夠在下一次介紹。

到此,可能還有困惑,就是爲何要有個變量存儲大小,爲何要有一個變量存儲類名。其實很簡單,咱們覺得的都是咱們爲類聲明一個對象,而後不就能夠直接使用此對象名引用該窗口類了?其實,這個名字只是存在咱們的編譯前,當咱們定義了一個窗口進程會將窗口的各個成員值放入內存,也就是內存中存着的是各個成員的值,那麼此時咱們生命的對象名還有嗎?固然不在了,因此咱們要在內存中存一個名稱,固然了這個名稱不必定要是WNDCLASSEX咱們能夠任意起名。

咱們有時候也會遇到一些名爲WNDCLASS的類,其實他是WNDCLASSEX的老版本,他的存在只是爲了兼容16位程序,當咱們使用時優先使用帶EX的,這也是一個命名規則。

定義完窗口類並不表明咱們可讓程序顯示一個窗口了,別忘了還要註冊顯示呢。

相關文章
相關標籤/搜索