天天看點

windows程式設計第五版_程式設計中三種基本結構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);
}           

複制

結構說明:

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注冊的名字,或者是任何預定義的控件類名。

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/170970.html原文連結:https://javaforall.cn