代码之家  ›  专栏  ›  技术社区  ›  luiscubal

wndclassex的概念、良好的编程习惯和系统类的wndproc

  •  2
  • luiscubal  · 技术社区  · 17 年前

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

    我已经成功地浏览了Windows API Hello World应用程序,并了解到这个类被我们自己的Windows以及Windows核心控件(如“编辑”、“按钮”等)使用。 我 了解它在某种程度上与wndproc相关(它允许我为它定义一个函数)

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

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

    窗口类与 C++类。

    哪个 真的? 没有帮助(它告诉我 不是 但不告诉我 )。事实上,这只会让我更加困惑,因为我很想把WNDCICEXEX与C++类联系起来,并认为“WNDCICEXEX”代表了一个控件。 类型 . 所以,我的第一个问题是 这是怎么一回事?

    第二,我理解可以在类中定义wndproc。但是,窗口还可以从子控件(或窗口,或在Windows API中调用的任何控件)获取消息。 怎么会这样?

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

    我知道Java/Swing、C/W/WORDOWS、Frm、C/GTK+和C++/WXWIDGET,所以我可能会理解与这些工具包的比较。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Andrew Grant    17 年前

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

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

    作为一个非常粗略的例子,“button”类wndproc将 WM_LBUTTONDOWN/WM_LBUTTONUP 按“点击”顺序排列。在此过程中,WNDPROC还将在“按下”状态下绘制按钮,作为对 WM_PAINT 消息。

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

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

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

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

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

        2
  •  1
  •   Murray    17 年前

    怎么会这样?

    子控件(这些也是Windows)向其父窗口发送消息,Windows(请注意Captilization,这是OS)知道该窗口的当前wndProc并调用它。

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

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