【问题标题】:WinAPI - how to organize lots of HWND objects?WinAPI - 如何组织大量 HWND 对象?
【发布时间】:2012-11-06 02:03:30
【问题描述】:

当我推出我的第一个 winapi UI 时,我发现自己在我的 WinMain 文件中创建了一大堆令人不舒服的 HWND 变量:

HWND foo;
HWND bar;
HWND baz;
HWND etc;

int WINAPI WinMain(...) {}

当然,这些变量在文件其余部分的函数中使用 - 例如消息循环 - 所以它们必须是可访问的。

对于我相对较小的 UI,我会堆积 30 个 HWND,以便它们处于可见范围内。这让我非常怀疑我做错了。

这是应该发生的事情,还是有更实用的方法来组织它?

【问题讨论】:

  • 我可能会选择std::map<std::string, HWND>。这样你就可以给每个人一个名字,这样你就可以在分组的同时轻松识别它。
  • 我认为像 hashmap 这样的东西会很有用,但它似乎有点……主观。它似乎增加了另一个级别的复杂性(记住键名),但也将一大堆东西留在了非常公开的范围内。这样可以吗?
  • 为什么不让这些HWND变量成为控制相应对象的类的成员呢?
  • @David - 嗯,我还没有想过要迁移到 MVC,但看起来这将是驱动程序。值得一试。这可能就是我正在寻找的解决方案。
  • 我对我认为是 MVC 的东西的破解已经太久了。下一个人的注意事项 - 使用 WndProc 作为类成员函数是一个真正的熊,尤其是对于超类。我在几个小时后放弃了,这绝对高于我的工资等级(必须了解更多关于钩子的信息)。所以,我将我的顶层窗口分成了几个“面板”,每个面板都有一个控件类型的类,可以将它们的 HWND 整齐地分组,并且仍然可以访问它们以调整大小和处理消息。

标签: c++ winapi organization hwnd winmain


【解决方案1】:

您有几个解决方案,具体取决于您的程序。

  1. 您可以将所有这些句柄放入一个或多个容器中,例如std::vector
  2. 您可以按照 chris 的建议对它们进行映射。
  3. 如果您的程序变得很大,您可能希望将它们组织成逻辑单元。例如,如果其中 15 个窗口用于一半逻辑,另外 15 个用于另一半(比如选项卡内的控件),那么您可能希望以某种方式对这些控件进行分组(文件、类、任何最符合逻辑的)。

【讨论】:

    【解决方案2】:

    您的主程序中只需要一个 HWND,它是用于主窗口的。

    API 不需要单个主窗口,但这是最常见的。即使从用户的角度来看,应用程序提供了几个明显独立的窗口,在程序中拥有一个主窗口也是一个好主意(它可以是不可见的,但提供分组)。

    然后,其他窗口要么是主窗口(在其中)的子窗口,要么是主窗口“拥有”的窗口。一般来说。特别是对于第一个 Windows 程序。 :-) 所以这些窗口不需要单独的变量。每当一个窗口应该对某事做出反应时,这就是给窗口的一条消息,这意味着使用相关的窗口句柄作为参数调用您的函数。

    每个子窗口都可以有一个唯一的整数 ID,这是跟踪它们的一种方式。

    但是随着您的进步,您会希望将状态与每个窗口相关联,最简单的方法是使用 Windows“子类化”API 将指针与每个窗口相关联。然后,您可以将窗口过程调用路由到关联 C++ 对象上的方法。不同的消息可以进一步路由到不同的消息处理方法,每个方法都可以访问窗口的状态(就是这个 C++ 对象)。

    【讨论】:

    • 感谢您的提示。当您说“只有一个 HWND”时,我有点困惑,因为所有常用控件及其各种 API 都创建/需要 HWND 对象。如果可能的话,我试图避免在入口点的前面堆积 50 个 HWND 变量...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多