【问题标题】:Concept of WNDCLASSEX, good programming habits and WndProc for system classesWNDCLASSEX的概念,良好的编程习惯和系统类的WndProc
【发布时间】:2010-10-12 18:13:48
【问题描述】:

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

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

虽然我可以找到有关此类的文档,但我找不到任何解释概念的内容。

到目前为止,我发现的唯一信息是:

一个窗口类没有任何关系 C++ 类。

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

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

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

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

【问题讨论】:

    标签: c winapi wndproc


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • +1,虽然旋转的长颈鹿并不完全是高品味的表现。 :S
    【解决方案2】:

    怎么会这样?

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

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

    每个窗口都必须有一个类,因此除非您的窗口存在现有类,否则您必须定义一个新类。您可能需要为您自己的所有顶级窗口定义类,但不需要为任何控件(这些控件的内置类)或对话框定义类,因为 Windows 中的对话框 API 使用另一个内置类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多