我最近在Win32上做了很多工作,但我很陌生,需要一些关于组织的建议。在C ++中,尽管它在语法上用于声明全局变量,但我总是觉得这很邋,,因为变量可以在任何地方修改,因此跟踪对它的更改变得更加困难。
在我的Win32项目中,我有几个需要在多个地方修改的变量。例如,一个这样的变量在WndProc函数中,也在对话过程函数中。由于它的使用方式,我能够简单地使用WndProc中的实际值,然后使用DialogBoxParam调用对话框,并通过lParam值将值传递给对话框。
但是,还有其他值,例如我用于绘制的某些位图或用于多个不同窗口消息调用的变量,其中值需要在WndProc函数的多个实例中保留或多个功能。我可以控制我创建的函数的参数,但是如果我需要将一个变量传递给WndProc函数以便我可以使用它而不管多个不同的窗口消息呢?如果我需要传递多个值,该怎么办?
到目前为止,我刚刚将所有内容都设置为全局,并且它可以工作,但它对我来说感觉很草率......但是我知道一些变量通常是全局性的 - 就像主窗口和实例变量一样。
你们都在想什么?
答案 0 :(得分:0)
您可以将窗口特定数据存储在与相关窗口关联的C ++对象中,而不是使用全局变量。
要将C ++对象与窗口关联,请使用任何现有的C ++类框架(例如Microsoft“WTL”或“Torjo”Win32GUI),或者使用{{ 3}} API函数。
对于Do It Yourself™解决方案,我在另一个SO答案中提出了 SetWindowSubclass
。
也就是说,对于一个小小的程序,全局变量+对话框是最简单的并且没有问题。因此,通常,使用Right Tool™来完成工作。对于较大的工作,使用更重的工具......
答案 1 :(得分:0)
如果你在代码中有一个特定的例子,它可能会有所帮助。但我认为你在谈论生命周期 - 你有一个资源(比如一个位图),你需要多次引用它来响应不同的Windows消息。你可以把它变成全球性的,是的,但我同意这很草率。
那么谁创造了这个窗口?可能是你的“App”类或类似的东西。由于该类的生命周期在逻辑上比窗口长,因此它可以保存窗口所需的资源。
或者更好的方法是创建“Window
”类。您的App
实例化Window
对象。 Window
对象创建Win32窗口并保存HWND(您现在已经从App
抽象出来,因此它不需要知道那些血腥的细节),Window
实例可以保存位图资源。