WNDCLASSEX的概念,良好的编程习惯和系统类的WndProc

标签 c winapi wndproc

我知道 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/

相关文章:

windows - 跨平台 COM 开发

c++ - 我应该怎么做才能让 WS_MAXIMIZE 工作?

c++ - 正确使用 AddClipboardFormatListener 并订阅 WM_CLIPBOARDUPDATE 消息

C#抑制多只鼠标的鼠标点击

c - 如何通过 minicom 或屏幕与 pty 通信?

c - 什么是事件句柄?

c - 在数组声明中使用 strlen

winapi - 检测 Windows 7 蓝牙堆栈

c - pic18f在C中的延迟x微秒

c++ - 为什么我不能在 Win32 中启用 unicode Edit 控件?