创建Windows类别
在Windows提前有很多定義Windows類別,但它可以很容易地創建自己的Windows類別。對于每個應用程序,至少你需要創建一個Windows類別。同Windows類為模版,生成窗體,處理消息。
有兩種數據結構可用于保存Windows類消息:WNDCLASS和WNDCLASSEX。WNDCLASS、是一種較早的數據結構。已不再使用。如今使用新的擴展版本號WNDCLASSEX。
WNDCLASSEX的結構為: typedef struct tagWNDCLASSEXW {UINT cbSize; //結構大小/* Win 3.x */UINT style; //樣式標記WNDPROC lpfnWndProc;//指向事件處理程序的函數指針int cbClsExtra;//額外的類信息int cbWndExtra;//額外的窗體信息HINSTANCE hInstance;//應用程序實例HICON hIcon;//主圖標HCURSOR hCursor;//鼠標圖像HBRUSH hbrBackground;//用于繪制窗體的背景刷LPCWSTR lpszMenuName;//菜單名稱LPCWSTR lpszClassName;//類名/* Win 4.0 */HICON hIconSm;//小圖標句柄 } WNDCLASSEXW創建一個這種數據結構。并對其每一個字段賦值。
WNDCLASSEX wcex;
第一個字段 cbSzie ,為結構WNDCLASSEX自身的大小。是給其它函數使用的而不是給自己知道的。
設置為?
wcex.cbSize = sizeof(WNDCLASSEX);
樣式標記style 。描寫敘述窗體的常規屬性。
屬性的組合依舊使用OR 即 | 來進行組合。
CS_BYTEALIGNCLIENT: 在字節邊界上(在x方向上)定位窗體的用戶區域的位置
CS_BYTEALIGNWINDOW: 在字節邊界上(在x方向上)定位窗體的位置
CS_CLASSDC: 該窗體類的全部窗體實例都共享一個窗體類DC
CS_DBLCLKS: 同意向窗體發送雙擊鼠標鍵的消息
CS_GLOBALCLASS: 當調用CreateWindow 或 CreateWindowEx 函數來創建窗體時同意它的hInstance參數和注冊窗體類時傳遞給RegisterClass 的 hInstance參數不同。假設不指定該風格。則這兩個 hInstance 必須同樣。
CS_HREDRAW: 當水平長度改變或移動窗體時,重畫整個窗體
CS_NOCLOSE: 禁止系統菜單的關閉選項
CS_OWNDC: 給予每一個窗體實例它本身的DC。注意。雖然這樣是非常方便。但它必須謹慎使用,由于每一個DC大約要占800個字節的內存。
CS_PARENTDC: 將子窗體的裁剪區域設置到父窗體的DC中去,這樣子窗體便能夠在父窗體上繪制自身。注意。這是子窗體還是從系統緩存中獲取DC,而不是使用父窗體的DC。
使用該風格能夠提高系統性能。
CS_SAVEBITS: 以位圖形式保存被該窗體遮擋的屏幕部分,這樣當給窗體移動以后。系統便能夠用該保存的位圖恢復屏幕移動的對應部分,從而系統不用向被該窗體遮擋的窗體發送 WM_PAINT 消息。該特性對于菜單類型的窗體比較合適,由于它一般是簡短的顯示一下之后便消失。設置該特性將添加顯示該窗體的時間。由于它通常要先分配保存位圖的內存。
CS_VREDRAW: 當垂直長度改變或移動窗體時。重畫整個窗體
這里對CS_OWNDC和CS_CLASSDC要討論一下:
首先。在沒有這兩個屬性時,在調用GetDC或BeginPaint時。windows用默認值創建一個設備描寫敘述表。對設備描寫敘述表屬性所做的一切改變在ReleaseDC或EndPaint使用后都會失效。
假設不想使用默認屬性,那么能夠使用CS_OWNDC 和 CS_CLASSDC 自定義設備描寫敘述表屬性。?
使用CS_OWNDC,這個窗體類的每個窗體都被創建了一個設備描寫敘述表,且一直存在直到窗體被刪除。僅僅須要初始化一次設備描寫敘述表(能夠在WM_CREATE消息期間完畢)當然能夠在須要時改變,以后每次調用GetDC和BeginPaint函數時返回的的設備描寫敘述表就是用你剛剛設置的設備描寫敘述表了。
CS_OWNDC風格僅僅影響GetDC和BeginPaint獲得的設備描寫敘述表,不影響其他函數(如GetWindowDC)獲得設備描寫敘述表。
而使用CS_CLASSDC與CS_OWNDC不同的地方是,窗體類使用此風格時。僅僅創建一個設備描寫敘述表為全部的窗體,全部的窗體共享這一個設備描寫敘述表(且是相互排斥的)。
然后是參數 lpfnWndProc ,為一個函數指針。指向事件處理程序,SDK中函數一般都為回調函數。回調函數,__stdcall被typedef為 CALLBACK,意思即為回調。回調的基本特征是被調用函數指針作為調用函數的參數,且使用__stdcall ,由被調用函數清除棧。
回調函數的被調用函數僅僅傳遞一個接口,而調用函數中實現被調用函數。并設置調用方式。
接下來兩個字段 cbClsExtra 和 cbWndExtra ,最初設計用來指示Windows在Windows類中保留一些額外空間,以保存執行時信息。可是,如今基本都不使用這兩個字段。都設置為0.
下一個字段為hInstance ,這個字段為程序驅動時傳遞給WinMain()函數的hinstance,即系統啟動程序時生成的該進程的實例句柄。
hIcon 為應用程序的圖標 句柄。使用函數LoadIcon()載入系統圖標。
hCursor。為光標句柄。使用LoadCursor進行載入。
hbrBackground 為又一次繪制或刷新窗體時。Windows至少會使用提前定義的顏色又一次繪制窗體客戶區域的背景。即重刷的畫刷。
畫刷,畫筆,。顏色。圖形為GDI的組成部分。一般使用函數GetStockObject()獲得系統的一些畫刷。還有一種寫法是直接(HBRUSH)(COLOR_WINDOW+1) 。
接下來字段為ipszMenuName。為一個以NULL結尾的字符串,包括載入到窗體上的菜單資源的名稱。
ipszClassName中保存Windows類的名字。系統須要跟蹤識別這些類。所以要有名字。一般為以NULL為結尾的字符串。
最后一個為小 圖標,顯示在win7的任務圖標欄。
這完全定義Windows類別。
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的创建Windows类别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [note]浏览器兼容性(embed标签
- 下一篇: Max Points on a Line