Strat Win32 Programming

Windows头文件中定义的四种数据结构体

结构体含义
MSGMessage structure
WNDCLASSWindow class structure
PAINTSTRUCTPaint structure
RECTRectangle structure

三个不同类型的 “ 句柄 ” ,使用大写标识符

标识符含义
HINSTANCE程序本身的“实例”句柄
HWND窗口的句柄
HDC设备上下文的句柄

常用的变量名前缀

前缀数据类型
cchar or WCHAR or TCHAR
byBYTE (unsigned char)
nshort
iint
x, yint used as x−coordinate or y−coordinate
cx, cyint used as x or y length; c stands for “count”
b or fBOOL (int); f stands for “flag”
wWORD (unsigned short)
lLONG (long)
dwDWORD (unsigned long)
fnfunction
sstring
szstring terminated by 0 character
hhandle
ppointer

注册窗口类

窗口始终基于窗口类创建。窗口类标识处理窗口消息的窗口过程。

可以基于一个窗口类创建多个窗口。例如,所有按钮窗口(包括按钮、复选框和单选按钮)都是基于同一个窗口类创建的。窗口类定义了窗口过程和基于该类创建的窗口的其他一些特征。当您创建一个窗口时,您将定义该窗口特有的附加特征。

在创建应用程序窗口之前,必须通过调用RegisterClass注册窗口类。这个函数需要一个参数,它是一个指向WNDCLASS类型结构的指针。该结构包含两个指向字符串的指针字段,因此在WINUSER.H头文件中以两种不同的方式定义该结构。首先是ASCII版本,WNDCLASSA:

typedef struct tagWNDCLASSA
{
	UINT style ;
	WNDPROC lpfnWndProc ;
	int cbClsExtra ;
	int cbWndExtra ;
	HINSTANCE hInstance ;
	HICON hIcon ;
	HCURSOR hCursor ;
	HBRUSH hbrBackground ;
	LPCSTR lpszMenuName ;
	LPCSTR lpszClassName ;
}
WNDCLASSA, * PWNDCLASSA, NEAR * NPWNDCLASSA, FAR * LPWNDCLASSA ;

注意这里使用的一些匈牙利表示法:lpfn前缀表示“指向函数的长指针”。(回想一下,在Win32 API中,长指针和近指针之间没有区别。这是16位Windows的残余。)cb前缀表示“字节数”,通常用于表示字节大小的变量。前缀h是一个句柄,而前缀hbr表示“刷子的句柄”。lpsz前缀是一个“指向以0结尾的字符串的长指针”。

该结构的Unicode版本定义如下:

typedef struct tagWNDCLASSW
{
	UINT style ;
	WNDPROC lpfnWndProc ;
	int cbClsExtra ;
	int cbWndExtra ;
	HINSTANCE hInstance ;
	HICON hIcon ;
	HCURSOR hCursor ;
	HBRUSH hbrBackground ;
	LPCWSTR lpszMenuName ;
	LPCWSTR lpszClassName ;
}
WNDCLASSW, * PWNDCLASSW, NEAR * NPWNDCLASSW, FAR * LPWNDCLASSW ;

唯一的区别是,最后两个字段被定义为指向常量宽−字符串的指针,而不是指向常量ASCII字符串的指针。

在WinMain中,通常像这样定义了一个 WNDCLASS 类型的结构体:

WNDCLASS wndclass;

然后初始化结构的10个字段并调用RegisterClass。

WNDCLASS 结构体中两个最重要的字段是第二个和最后一个。第二个字段(lpfnWndProc)是用于基于该类的所有窗口的窗口过程的地址。最后一个字段是窗口类的文本名称。这可以是任何你想要的。在只创建一个窗口的程序中,窗口类名通常设置为程序的名称。

接下来的两个字段用于在Windows内部维护的类结构和窗口结构中保留一些额外的空间:

wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值