据我所知,Windows API使用"类",依赖于WNDCLASS/WNDCLASSEX结构.
我已成功通过Windows API Hello World应用程序,并了解此类由我们自己的窗口使用,但也由Windows核心控件使用,如"编辑","按钮"等.我也理解它与某种方式有关WndProc(它允许我为它定义一个函数)
虽然我可以找到关于这个类的文档,但我找不到任何解释这个概念的东西.
到目前为止,我发现的唯一一件事是:
Window类与C++类没有任何关系.
这实在不利于(它告诉我它是什么不是,但不Tellme公司它是什么的).事实上,这只会让我更加困惑,因为我很想将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
消息的响应.
在窗口需要将动作传达给父母(例如,点击)的情况下,它将消息作为"通知"或"命令"发送.这些消息由子控件手动创建,并包含标识符和任何相关数据.
所有这一切的好处只是通过创建按钮类的窗口(使用CreateWindow)我自动获得所有这些行为.
除了由windows提供的窗口,我还可以创建自己的窗口,可以在我的应用程序中重新启动.您必须为主窗口注册至少一个类(否则它将没有功能,因此不会非常有趣)但除此之外,它取决于您.
应用程序很可能只包含常规控件(按钮,列表视图,进度条),但有时您可能想要创建自定义类.这可能是封装特定行为,或者因为您希望通过程序使用该控件的许多实例.
例如,如果我的应用程序的UI应该需要在鼠标悬停时旋转的长颈鹿图像,我可以编写代码在WindowProcedure中执行此操作并将其注册为新类("SPINNYGIRAFFE").我的应用程序的其余部分只是创建了"SPINNYGIRAFFE"类的窗口,一切正常.