2

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

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

4

2 回答 2

6

The ATOM returned by RegisterClassEx uniquely identifies your "window class" which can then be referred to in other windows APIs. [MSDN]

Effectively it is a hash so as to reduce the amount of data processed each time a window is created or looked for. It does also mean that multiple windows with same features can be easily created and identified.

I was addressing the practical reasons above. Hans Passant's answer correctly explains this is the OO class concept provided for C. Further MSDN example.

于 2012-08-04T12:54:16.903 回答
5

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

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

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

即使您不打算重新使用窗口,Windows 也会要求您调用 RegisterClassEx()。这是迄今为止在您自己的代码中最常见的函数用法。在您编写一个实现控件的库之前,您不会开始真正利用它,其他代码可以使用的窗口。像“编辑”。

于 2012-08-04T15:35:53.720 回答