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

时间:2009-03-11 18:48:16

标签: c winapi wndproc

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

我已成功浏览了Windows API Hello World应用程序,并了解此类由我们自己的窗口使用,但也由Windows核心控件使用,例如“EDIT”,“BUTTON”等。 我明白它与WndProc有某种关联(它允许我为它定义一个函数)

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

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

  

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

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

第二,我明白可以在类中定义WndProc。但是,窗口也可以从子控件(或窗口,或Windows API中调用它们)中获取消息。 这怎么可能?

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

如果窗口需要将动作传达给父母(例如点击),则会将消息作为“通知”或“命令”发送。这些消息由子控件手动创建,包含标识符和任何相关数据。

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

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

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

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

答案 1 :(得分:1)

这怎么可能?

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

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

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