windows程序设计(三)视窗详解:注册视窗类别(RegisterClass与RegisterClassEx)

在一个视窗显示在屏幕上之间,首先就是要进行视窗的注册工作,在此使用的是 RegisterClass进行视窗类别的注册。RegisterClass函数的功能为注册一个窗口类,供以后在对CreateWindow或CreateWindowEx函数的调用中使用。
目前RegisterClass函数已被RegisterClassEx函数做取代。但是,如果不需要设置类小图标,则仍然可以使用RegisterClass。

ATOM RegisterClassExA(
  const WNDCLASSEXA *Arg1
);

可以看到RegisterClassEx只有一个参数,为const WNDCLASSEX *类型,为指向WNDCLASSEX 类型的一个指针。
如果函数成功,则返回值是一个类原子,它唯一地标识正在注册的类。如果函数 失败,则返回值为0。
对于被注册的类型为WNDCLASS类型或者WNDCLASSEX类型
最开始的WNDCLASS定义了两种不同版本,第一种是ASCII版本:

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 ; 

第二种是UNICODE版本:

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, *NPWNDCLASSA, *LPWNDCLASSA;

目前该结构已经被RegisterClassEx函数使用的WNDCLASSEX结构取代,WNDCLASSEX的结构如下所示:

typedef struct tagWNDCLASSEXA {
  UINT      cbSize;//该结构的大小 sizeof(WNDCLASSEX)  必须要设置该参数
  UINT      style;//样式
  WNDPROC   lpfnWndProc;//窗口过程函数指针
  int       cbClsExtra;//根据窗口类结构分配的额外字节数  一般为0
  int       cbWndExtra;//窗口实例后要分配的额外字节数。
  HINSTANCE hInstance;//实例句柄
  HICON     hIcon;//类图标的句柄
  HCURSOR   hCursor;//类光标的句柄
  HBRUSH    hbrBackground;//类背景画笔句柄
  LPCSTR    lpszMenuName;//菜单名称
  LPCSTR    lpszClassName;//类窗口名称
  HICON     hIconSm;//类的小图标
} WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;

在该结构中,最重要的参数为lpfnWndProc和lpszClassName。在第一个例子中,对于WNDCLASSEX进行如下的初始化:

static TCHAR szAppName[] = TEXT("HelloWin");
 	WNDCLASSEX wndclass; //用描述主窗口的参数填充WNDCLASSEX结构
	wndclass.cbSize = sizeof(wndclass); //结构的大小(必须定义结构大小)
	wndclass.style = CS_HREDRAW | CS_VREDRAW; //样式
	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 = szAppName;  //窗口类的名称
	wndclass.hIconSm = NULL; //没有类的小图标

可以看出lpfnWndProc中所赋值为窗口过程函数WndProc,这个过程函数将处理依据这个视窗类别建立的所有视窗的全部信息,窗口类名则为szAppName字符串。
当12个参数被填充完成时,就可以使用RegisterClassEx进行注册。

参考资料:
[1]《Windows程序设计(第五版)》
[2]https://docs.microsoft.com/zh-cn/welcome-to-docs

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值