【问题标题】:What is the typical convention for organization with Win32?使用 Win32 组织的典型约定是什么?
【发布时间】:2013-03-14 21:31:15
【问题描述】:

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

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

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

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

大家觉得呢?

【问题讨论】:

  • 是的:全局变量是“坏的”。是的,在经典的 Win32/C 编程中,全局变量通常或多或少是不可避免的。这是你的问题吗?

标签: c++ winapi organization


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    要将 C++ 对象与窗口关联,请使用任何现有的 C++ 类框架(例如 Microsoft 的 WTL 或 Torjo 的 Win32GUI),或使用 SetWindowSubclass API 函数自行完成。

    对于 Do It Yourself™ 解决方案,我在另一个 SO 答案中提出了 a complete C++ example

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多