WNDCLASS

WNDCLASS

WNDCLASS是一個由系統支持的結構,用來儲存某一類視窗的信息,如ClassStyle,訊息處理函式,Icon,Cursor,背景Brush等。也就是說,CreateWindow只是將某個WNDCLASS定義的窗體變成實例。 結構WNDCLASS包含一個視窗類的全部信息,也是Windows編程中使用的基本數據結構之一,應用程式通過定義一個視窗類確定視窗的屬性

基本信息

要得到某一視窗的WNDCLASS數據,可以用GetClassLong();

RegisterClass()就是在系統註冊某一類型的窗體。也就是將你提供的WNDCLASS數據註冊為一個視窗類,在WNDCLASS.lpszClassName中定義該WNDCLASS的標識,

無論CreateWindow或CreateWindowEx創建的視窗都必須對應一個WNDCLASS,但一個WNDCLASS可以有多個視窗對象。

有一些系統預定義的視窗類,如:

ClassName=_T("BUTTON" or "COMBOBOX" or "EDIT" or "LISTBOX" or "MDICLIENT" or "SCROLLBAR" or "STATIC")

要用這些窗體,直接用CreateWindow創建相應對象就是了。

要得到某一視窗的視窗類,可以用GetClassName();

WNDCLASS中的回調函式是窗體的訊息處理函式:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM

lParam)

視窗屬性定義

基本方法

typedef struct _WNDCLASS {

UINT style;// 視窗類型

WNDPROC lpfnWndProc;//視窗處理函式

int cbClsExtra;//視窗擴展

int cbWndExtra;//視窗實例擴展

HINSTANCE hInstance;//實例句柄

HICON hIcon;//視窗的最小化圖示

HCURSOR hCursor;//視窗滑鼠游標

HBRUSH hbrBackground;//視窗背景色

LPCTSTR lpszMenuName;//視窗選單

LPCTSTR lpszClassName;// 視窗類名

} WNDCLASS, *LPWNDCLASS;

舉例說明

#include <windows.h>

//包含應用程式中數據類型和數據結構的定義

long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//視窗說明

//WinMain函式是所有Windows應用程式的入口,類似c語言中的main函式 其功能是完成//一系列的定義和初始化,並產生訊息循環

/* WinMain函式實現以下功能:註冊視窗類,建立視窗及執行其他必要的初始化工作;進入訊息循環,根據從應用程式訊息佇列接受的訊息,調用相應的處理過程;當訊息循環檢

測到WM_QUIT訊息時終止程式運行

WinMain函式有三個基本部分組成:函式說明、初始化和訊息循環*/

//函式說明

int WINAPI WinMain(

HINSTANCE hInstance, // handle to current instance

HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine, // command line

int nCmdShow // show state

)

//初始化

//初始化包括視窗類的定義、註冊、創建視窗實例和顯示視窗四部分

{

HWND hwnd;

MSG Msg;

WNDCLASS wndclass;

char lpszClassName[]="視窗";//視窗類名

char lpszTitle[]="徐新坡"; //視窗標題名

//視窗類定義

//視窗類定義了視窗的形式與功能 視窗類定義通過給視窗類數據結構WNDCLASS賦值完成

//該數據結構中包含視窗類的各種屬性

wndclass.style =0; // 視窗類型為預設類型

wndclass.lpfnWndProc=WndProc; //定義視窗處理函式

wndclass.cbClsExtra=0; //視窗類無擴展

wndclass.cbWndExtra=0; //視窗實例無擴展

wndclass.hInstance=hInstance; //當前實例句柄

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//視窗的最小化圖示為預設圖示

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); // 視窗採用箭頭游標

wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //視窗背景為白色

wndclass.lpszMenuName=NULL; //視窗無選單

wndclass.lpszClassName=lpszClassName; //視窗類名為“視窗”

//////////////// 以下是視窗類的註冊 Windows系統本身提供部分預定義的視窗類,程式設計師也可以自定義視窗類// 視窗類必須先註冊 後使用

if(!RegisterClass(&wndclass)) //如果註冊失敗 發出警告

{MessageBeep(0); return FALSE;}

///////////////創建視窗 創建一個視窗的實例由函式CreateWindow()實現

hwnd=CreateWindow( lpszClassName, //視窗類名

lpszTitle, //視窗標題名

WS_OVERLAPPEDWINDOW, //視窗的風格

CW_USEDEFAULT,

CW_USEDEFAULT, //視窗左上角坐標值為預設值

CW_USEDEFAULT, CW_USEDEFAULT, //視窗的高和寬為預設值

NULL, //此視窗無父視窗

NULL, //此視窗無子選單

hInstance, //創建此視窗的應用程式的當前句柄

NULL //不使用該值

);

/////////////顯示視窗

ShowWindow(hwnd,nCmdShow);

//繪製用戶區

UpdateWindow(hwnd);

/////////////訊息循環

while(GetMessage(&Msg,NULL,0,0))

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

return Msg.wParam; //訊息循環結束 即程式結束時 將信息返回系統

}

/////////////視窗函式

//視窗函式定義了應用程式對接收到的不同訊息的回響,其中包含了應用程式對各種可能接受到的訊息的

//處理過程,是訊息處理分支控制語句的集合

long CALLBACK WndProc(

HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam

)

{

switch(message)

{

case WM_DESTROY:

PostQuitMessage(0);

default: //預設時採用系統訊息預設處理函式

return DefWindowProc(hwnd,message,wParam,lParam);

}

return (0);

}

數據結構原型

typedef struct_WNDCLASS{

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

}WNDCLASS;

結構說明

WNDCLASS 結構包含了RegisterClass函式註冊的類屬性

分量簡介

style:指定類風格。這些風格可通過按位或操作組合起來。風格如下:

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: 當垂直長度改變或移動視窗時,重畫整個視窗

lpfnWndProc: 指向視窗過程

cbClsExtra: 指定緊隨在 WNDCLASS 數據結構後分配的位元組數。系統將其初始化為零。

cbWndExtra: 指定緊隨在視窗實例之後分配的位元組數,系統將其初始化為零。如果應用程式正在用WNDCLASS結構註冊一個在RC

資源描述檔案中用CLASS指令創建的對話框時,它必須設定這個欄位為 DLGWINDOWEXTRA。

hInstance: 標識了該視窗類的視窗過程所在的模組實例的句柄,不能為NULL。

hIcon: 標識了該視窗類的圖示。hIcon欄位必須是一個圖示的句柄;若hIcon欄位為NULL,那么系統將提供一個默認的圖示。

hCursor: 標識該視窗類的游標,hCursor必須是一個游標資源的句柄。若hCursor欄位為NULL,則無論何時滑鼠移到應用程式視窗時,應用程式必須顯式設定游標形狀。

hbrBackground: 標識了該視窗類的背景畫刷。hbrBackground欄位必須是用於繪製背景的物理刷子的句柄,或者是一個顏色的值。如果給出一個顏色的值,它必須是下面列出的標準系統顏色之一(系統將對所選顏色加1)。如果給出了顏色值,它必須是轉換成下列的HBRUSH類型之一的顏色:

COLOR_ACTIVEBORDER

COLOR_ACTIVECAPTION

COLOR_APPWORKSPACE

COLOR_BACKGROUND

COLOR_BTNFACE

COLOR_BTHSHADOW

COLOR_BTNTEXT

COLOR_CAPTIONTEXT

COLOR_GRAYTEXT

COLOR_HIGHLIGHT

COLOR_HIGHLIGHTTEXT

COLOR_INACTIVEBORDER

COLOR_INACTIVECAPTION

COLOR_MENU

COLOR_MENUTEXT

COLOR_SCROLLBAR

COLOR_WINDOW

COLOR_WINDOWFRAME

COLOR_WINDOWTEXT

當hbrBackground欄位為NULL時,每當需要繪製其用戶區域時,應用程式必須自己來繪製其背景。應用程式可以通過處理WM_ERASEBKGND 訊息或檢查由 BeginPaint 函式填寫的 PAINTSTRUCT 結構的fErase 欄位來確定背景什麼時候需要著色。

lpszMenuName :指向NULL結束的字元串,該字元串描述選單的資源名,如同在資源檔案里顯示的名字一樣。若使用一個整數標識選單,可以使用MAKEINTRESOURCE宏。如果lpszMenuName為NULL,那么該視窗類的視窗將沒有默認選單。

lpszClassName :指向NULL結束的字元串,或者是一個原型(atom)。若該參數是一個原型,它必須是一個有先前調用RegisterClass或者 RegisterClassEx函式產生的類原型。類原型必須作為lpszClassName的低字,高字必須為0.若lpszClassName是一個字元串,它描述了視窗類名。這個類名可以是由RegisterClass或RegisterClassEx註冊的名字,或者是任何預定義的控制項類名。

相關詞條

相關搜尋

熱門詞條

聯絡我們