zl程序教程

您现在的位置是:首页 >  其他

当前栏目

新的例子程序

程序 例子
2023-09-14 09:10:44 时间

我想,是时候修改下我们一直以来使用的例子程序的代码了。我听说最近有一门新的语言叫C++,它看起来变得非常流行。那我也赶一下时髦。

代码如下

首先,我定义了一个Window窗口类,里面包含一些创建一个窗口所需要的各种小部件,例如窗口句柄,注册窗口,创建窗口,窗口处理过程函数等。类的头文件如下图所示:

>> 请移步至 topomel 查看图片 <<

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

>> 请移步至 topomel 查看图片 <<

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

>> 请移步至 topomel 查看图片 <<

最后,是整个程序的入口点。

>> 请移步至 topomel 查看图片 <<

这个程序的基本思想和我们以前的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》