【发布时间】:2011-03-03 11:58:15
【问题描述】:
有一个简单的 WinAPI 应用程序。它目前所做的只是:
- 注册一个窗口类
- 使用菜单注册托盘图标
- 在注册表中创建一个值以自动启动
- 最后,它使用互斥体检查它是否是唯一的
由于我习惯于主要使用 C++ 编写代码,并且不允许使用 MFC,因此我不得不以某种方式将其封装到 C++ 类中。到目前为止,我想出了这样一个设计:
- 有一个代表应用程序的类
- 它保留所有 wndclass、hinstance 等变量,其中 hinstance 作为构造函数参数以及 icmdshow 和其他参数传递(参见 WinMain 原型)
- 具有注册窗口类、托盘图标、注册表信息的功能
- 它将消息循环封装在一个函数中
在 WinMain 中,完成以下操作:
Application app(hInstance, szCmdLIne, iCmdShow);
return app.exec();
并且构造函数执行以下操作:
registerClass();
registerTray();
registerAutostart();
到目前为止一切顺利。现在的问题是:如何创建窗口过程(必须是静态的,因为它是指向函数的 c 风格指针)并跟踪应用程序对象是什么,也就是说,保持指向应用程序的指针。
主要问题是:这是通常的做法吗?我是不是把事情复杂化了?可以将 hInstance 作为参数传递给 Application 构造函数吗? WndProc 在哪里?
也许 WndProc 应该在类之外并且应用程序指针是全局的?然后 WndProc 调用 Application 方法来响应各种事件。
还有另一种可能的解决方案:将应用程序类设为单例。然后从 WndProc 中获取该对象的句柄就很简单了。
【问题讨论】:
-
这就像你正在重新实现
Qt已经做得很好的东西。我想使用外部库不是一种选择? -
不,这是一个大学项目,我自己也是 Qt 的忠实粉丝 :) 是的,真的,这里的事情比 Qt 复杂得多,但你迟早必须学习一切...
-
我同意。我也是这样学的。但是,您仍然可以观看
Qt源代码,看看他们是如何做到的。不过这可能很复杂。 -
如果应用程序作为 C 程序运行良好,我看不出有任何理由将其“转换”为 c++。我可以看到很多不这样做的原因。