2

我了解 Windows API 使用“类”,依赖于WNDCLASS / WNDCLASSEX结构。

我已经成功通过了windows API Hello World应用程序,了解到这个类被我们自己的windows使用,也被Windows核心控件使用,例如“EDIT”,“BUTTON”等。我明白它与WndProc(它允许我为它定义一个函数)

虽然我可以找到关于这个类的文档,但我找不到任何解释这个概念的东西。

到目前为止,我发现的唯一一件事是:

Window 类与 C++ 类没有任何关系。

真的没有帮助(它告诉我它不是什么但不告诉我它什么)。事实上,这只会让我更加困惑,因为我很想将 WNDCLASSEX 与 C++ 类相关联,并认为“WNDCLASSEX”代表一种控制类型 。所以,我的第一个问题是它是什么?

其次,我知道可以在类中定义 WndProc。但是,窗口也可以从子控件(或窗口,或在 Windows API 中调用的任何内容)获取消息。怎么会这样?

最后,什么时候定义一个新类是一个好的编程习惯?每个应用程序(对于主框架)、每个框架、每个我定义的控件(例如,如果我创建自己的进度条类)?

我知道 Java/Swing、C#/Windows.Form、C/GTK+ 和 C++/wxWidgets,所以我可能会理解与这些工具包的比较。

4

2 回答 2

6

窗口类描述了将用于该类的所有实例的属性。除了颜色、图标等,这些属性之一是窗口过程。这是一个回调函数,负责处理来自系统的所有消息并在必要时对其进行处理。

虽然不相关,但该概念类似于 C++ 类——一段代码定义了一个类的数据和功能,并且该类可能有许多实例。

作为一个非常粗略的示例,“按钮”类 WndProc 将WM_LBUTTONDOWN/WM_LBUTTONUP序列转换为“点击”。在此序列期间,WndProc 还将按钮绘制为“按下”状态作为对WM_PAINT消息的响应。

当一个窗口需要向父级传达一个动作(例如点击)时,它会以“通知”或“命令”的形式发送消息。这些消息由子控件手动创建并包含标识符和任何相关数据。

所有这一切的好处只是通过创建按钮类的窗口(使用 CreateWindow),我自动获得了所有这些行为。

除了 windows 提供的那些,我还可以创建自己的窗口,这些窗口可以在我的应用程序中重新使用。您必须为您的主窗口注册至少一个类(否则它将没有任何功能,因此不会很有趣),但除此之外,这取决于您。

应用程序很可能只包含常规控件(按钮、列表视图、进度条),但有时您可能想要创建自定义类。这可能是为了封装特定的行为,或者因为您希望通过您的程序使用该控件的许多实例。

例如,如果我的应用程序的 UI 需要在鼠标悬停时旋转的长颈鹿图像,我可以编写代码在 WindowProcedure 中执行此操作并将其注册为新类(“SPINNYGIRAFFE”)。我的应用程序的其余部分只是创建“SPINNYGIRAFFE”类的窗口,一切正常。

于 2009-03-11T19:01:05.023 回答
1

怎么会这样?

子控件(这些也是窗口)向其父窗口发送消息,Windows(注意大写字母,这是操作系统)知道该窗口的当前 WndProc 并调用它。

什么时候定义一个新类是一个好的编程习惯?

Every window must have a class, thus unless an existing class exists for your window, you must define a new class. You likely will need to define classes for all your own top level windows, but not for any controls (built in classes for these) or for dialogs since the dialog box APIs in Windows use another buildin class.

于 2009-03-11T19:09:14.817 回答