注册窗口类

Ris*_*skX 2 winapi

我想我的问题对于那些花时间处理Win32 API的人来说相对容易.

所以我的问题是:
在初始化WNDCLASSEX实例后,我们需要使用"RegisterClassEx"函数"注​​册"它,为什么?我们为什么这样做?这种注册的含义是什么?在什么情况下我需要注册?

Mar*_*urd 6

ATOM通过返回RegisterClassEx唯一标识"窗口类",然后可以在其他的Windows API来引用.[ MSDN ]

实际上,它是一个哈希值,以便在每次创建或查找窗口时减少处理的数据量.它还意味着可以轻松创建和识别具有相同功能的多个窗口.

我正在解决上面的实际原因.Hans Passant的回答正确地解释了这是为C提供的OO类概念.进一步的MSDN示例.


Han*_*ant 5

函数名中的单词Class很重要.当您使用面向对象语言(如C++,Delphi,Java或C#等)编写代码时,可以使用class关键字创建具有行为的对象.但是winapi被设计用于C语言,这是一种没有这种功能的语言.RegisterClassEx()函数是对它的模拟,它允许您创建一个窗口,从命名类"派生"它的行为,您可以覆盖的行为.使用该类名创建的每个窗口都具有相同的行为.

您传递的WNDCLASSEX结构为窗口提供了默认行为.这个结构中最重要的成员是:

  • lpszClassName.这相当于C++类名.您可以稍后调用CreateWindowEx()并传递该名称以获取以某种方式运行的窗口.Windows本身调用RegisterClassEx()来注册它的几个内置窗口类,然后您可以在自己的代码中重复使用它们."EDIT","BUTTON"和"LISTBOX"就是很好的例子.
  • 的lpfnWndProc.这就是窗口类的特定默认行为.其窗口过程的地址,用于实现特定消息的消息处理程序.您可以通过在CreateWindowEx()调用中指定另一个窗口过程来进一步自定义默认行为,换句话说,从基类"派生"您自己的类.这样的窗口过程必须始终调用DefWindowProc(),相当于调用基类方法.或者换句话说,窗口有一个虚方法.
  • hIcon,等等.它们相当于基类的属性,它们设置了影响默认消息处理程序的默认值.帮助您保持窗口过程简单.例如,很少需要为WM_ERASEBKGND编写消息处理程序,hbrBackground成员设置窗口的默认背景.

即使您不打算重新使用窗口,Windows也要求您调用RegisterClassEx().到目前为止,这是您自己的代码中最常用的函数.在编写实现控件的库,其他代码可以使用的窗口之前,您不会开始真正利用它.喜欢"编辑".