我知道 Windows API 使用“类”,依赖于 WNDCLASS/WNDCLASSEX结构。
通过windows API Hello World应用程序,了解到这个类被我们自己的windows使用,也被Windows核心控件使用,如“EDIT”、“BUTTON”等。 我也明白它在某种程度上与 WndProc 相关(它允许我为它定义一个函数)
虽然我可以找到关于这个类的文档,但我找不到任何解释概念的内容。
到目前为止,我唯一发现的是:
A Window Class has NOTHING to do with C++ classes.
哪个真的没有帮助(它告诉我它不是但没有告诉我它是什么)。事实上,这只会让我更加困惑,因为我很想将 WNDCLASSEX 与 C++ 类相关联,并认为“WNDCLASSEX”代表一个控件类型 . 所以,我的第一个问题是它是什么?
其次,我知道可以在类中定义 WndProc。但是,窗口也可以从子控件(或窗口,或在 Windows API 中调用的任何内容)获取消息。 怎么会这样?
最后,什么时候定义新类是一个好的编程习惯?每个应用程序(对于主框架)、每个框架、每个我定义的控件(例如,如果我创建自己的进度条类)?
我知道 Java/Swing、C#/Windows.Form、C/GTK+ 和 C++/wxWidgets,所以我可能会理解与这些工具包的比较。
最佳答案
窗口类描述将用于该类的所有实例的属性。除了颜色、图标等,这些属性之一就是窗口过程。这是回调函数,负责处理来自系统的所有消息并根据需要进行处理。
虽然不相关,但该概念类似于 C++ 类 - 一段代码定义了一个类的数据和功能,并且该类可能有许多实例。
作为一个非常粗略的示例,“BUTTON”类 WndProc 将 WM_LBUTTONDOWN/WM_LBUTTONUP
序列转换为“点击”。在此序列期间,WndProc 还将以“按下”状态绘制按钮,作为对 WM_PAINT
消息的响应。
如果窗口需要向父窗口传达一个 Action (例如点击),它会发送消息作为“通知”或“命令”。这些消息由子控件手动创建,并包含标识符和任何相关数据。
所有这一切的好处只是通过创建按钮类的窗口(使用 CreateWindow)我自动获得所有这些行为。
除了 Windows 提供的窗口外,我还可以创建自己的窗口,这些窗口可以在我的应用程序中重新使用。您必须至少为您的主窗口注册一个类(否则它将没有任何功能,因此不会很有趣),但除此之外由您决定。
很有可能只包含常规控件(按钮、 ListView 、进度条)的应用程序,但有时您可能希望创建自定义类。这可能是为了封装特定行为,或者是因为您希望通过您的程序使用该控件的许多实例。
例如,如果我的应用程序的 UI 需要长颈鹿的图像,当鼠标悬停在它们上方时会旋转,我可以在 WindowProcedure 中编写代码来执行此操作并将其注册为新类(“SPINNYGIRAFFE”)。我的应用程序的其余部分只是创建“SPINNYGIRAFFE”类的窗口,一切正常。
关于WNDCLASSEX的概念,良好的编程习惯和系统类的WndProc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/635847/