C++|新的例子程序

C++|新的例子程序

文章图片

C++|新的例子程序

文章图片

C++|新的例子程序

文章图片


我想 , 是时候修改下我们一直以来使用的例子程序的代码了 。 我听说最近有一门新的语言叫C++ , 它看起来变得非常流行 。 那我也赶一下时髦 。
代码如下首先 , 我定义了一个Window窗口类 , 里面包含一些创建一个窗口所需要的各种小部件 , 例如窗口句柄 , 注册窗口 , 创建窗口 , 窗口处理过程函数等 。 类的头文件如下图所示:

接下来 , 是对应的类实现代码 。


我们还定义了一个继承自Window的类RootWindow , 重写了其创建窗口和消息处理的方法 。

最后 , 是整个程序的入口点 。
【C++|新的例子程序】
这个程序的基本思想和我们以前的scratch 程序一样 , 但是现在它有了新鲜的柠檬味C++ 气味 。我们没有将状态保存在全局变量中 , 而是声明了一个 C++ 类并将其连接到窗口 。为简单起见 , 对象的生命周期与窗口本身相关联 。
首先 , 有一个Window基类 , 我们将使用它作为我们未来任何“与窗口相关的类”工作的基础类 。目前唯一的派生类是 RootWindow , 它是目前程序使用的唯一窗口的顶级框架窗口 。正如你可能怀疑的那样 , 稍后我们可能会在需要时创建其他派生类 。
WinRegisterClass方法是虚拟的(并且不做任何有趣的事情)的原因是 , 派生类可以修改注册类时使用的 WNDCLASS 。我没有立即需要它 , 但如果我需要它 , 它会在那里随时可以供我使用 。
我们使用 GWLP_USERDATA来存储指向关联类的指针 , 从而允许我们从窗口句柄中重建对象的访问 。
请注意 , 在 RootWindow::HandleMessage 方法中 , 我使用的是 Visual C++ __super 扩展 。如果你不想依赖非标准扩展 , 则可以改为如下的代码:
class RootWindow : public Window
{
public:
typedef Window super;

并使用 super 而不是 __super 。
这个程序没有做任何有趣的事情; 它只是将来文章中的例子程序的基本骨架 。
总结瞧 , 穿上C++的衣服后 , 程序逻辑和可读性有了巨大的变化 。 通过C++的封装和继承 , 将Win32窗口的运行机制和消息模型都放到一个类中 , 我们的入口点如释重负了 。
有时候我甚至感觉到 , 我不是在写代码 , 而是在雕琢一件艺术品 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《The new scratch program》