有了主函數,程序即可以運行了,程序首先找到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的,這也是一個命名規則。
定義完窗口類並不表明咱們可讓程序顯示一個窗口了,別忘了還要註冊顯示呢。