2

我最近一直在使用 Win32,但我对它很陌生,需要一些关于组织的建议。在 C++ 中,虽然在语法上声明全局变量是可行的,但我一直觉得这是草率的,因为变量可以在任何地方修改,因此跟踪对它的更改变得更加困难。

在我的 Win32 项目中,我有几个变量需要在多个地方进行修改。例如,一个这样的变量在 WndProc 函数和对话过程函数中。由于它的使用方式,我能够简单地使用 WndProc 中的实际值,然后使用 DialogBoxParam 调用对话框,并通过 lParam 值将值传递给对话框。

但是,还有其他值,例如我用于绘图的某些位图或在多个不同窗口消息调用中使用的变量,其中值需要在 WndProc 函数的多个实例或多个函数中保留。我可以控制我创建的函数的参数,但是如果我需要将一个变量传递给 WndProc 函数,以便我可以使用它而不考虑多个不同的窗口消息,该怎么办?如果我需要传入多个值怎么办?

到目前为止,我一直在将所有内容都设为全局,并且可以正常工作,但对我来说感觉很草率……但我知道,按照惯例,某些变量通常是全局的——比如主窗口和实例变量。

大家怎么看?

4

2 回答 2

0

您可以将特定于窗口的数据存储在与相关窗口关联的 C++ 对象中,而不是使用全局变量。

要将 C++ 对象与窗口关联,可以使用许多现有的 C++ 类框架(例如 Microsoft 的WTL或 Torjo 的Win32GUI),或者使用SetWindowSubclassAPI 函数自己完成。

对于 Do It Yourself™ 解决方案,我在另一个 SO 答案中提供了一个完整的 C++ 示例。

也就是说,对于一个很小的程序全局变量+对话框是最简单的并且没有问题。所以一般来说,使用 Right Tool™ 来完成这项工作。对于更大的工作,使用更重的工具……

于 2013-03-14T21:39:56.110 回答
0

如果您在代码中有一个特定的示例,它可能会有所帮助。但我认为你在谈论生命周期——你有一个资源(比如一个位图),你需要多次引用它以响应不同的 Windows 消息。你可以让它全球化,是的,但我同意这是草率的。

那么是谁创造了这个窗口呢?可能是您的“应用程序”类或类似的东西。由于该类的生命周期在逻辑上比窗口的生命周期长,因此它可以保存窗口所需的资源。

或者更好的方法是创建一个“ Window”类。您App实例化了一个Window对象。该Window对象创建 Win32 窗口并保存 HWND(您现在已经将它从 抽象出来,App因此它不需要知道那些血淋淋的细节),并且该Window实例可以保存位图资源。

于 2013-03-14T21:39:58.863 回答