注册窗口类

时间:2012-08-04 11:47:58

标签: winapi

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

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

2 个答案:

答案 0 :(得分:5)

ATOM返回的RegisterClassEx唯一标识您的“窗口类”,然后可以在其他Windows API中引用它。 [MSDN]

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

我正在解决上面的实际原因。 Hans Passant的answer正确地解释了这是为C. Further MSDN example提供的OO类概念。

答案 1 :(得分:5)

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

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

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

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