2012-11-06 19 views
0

当我推着我的第一个WINAPI UI,我发现自己在我的WinMain文件中创建HWND变量大,不舒服的堆栈:WinAPI - 如何组织很多HWND对象?

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

int WINAPI WinMain(...) {} 

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

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

这是应该发生的,还是有一个更实际的方式来组织这?

+1

我可能会用'std :: map '去。这样,您可以给每个人一个名字,以便您可以轻松识别它们,同时将它们分组。 – chris

+0

我以为像hashmap这样的东西会很有用,但它似乎有点......主观的。它似乎增加了另一层次的复杂性(记住关键名称),但也在一个非常公开的范围内留下了一大堆东西。这个可以吗? – Ben

+1

为什么不让这些'HWND'变量控制相应对象的类的成员? –

回答

1

你有几个解决方案,取决于你的程序是什么。

  1. 您可以将所有这些句柄放在一个或多个容器中,如std::vector
  2. 您可以将它们映射为chris建议。
  3. 如果程序变大,您可能需要将它们组织成逻辑单元。例如,如果这些窗口中的15个用于逻辑的一半,另一半用于另一半(表示控制器内部的控件),那么您可能希望以某种方式对这些控件进行分组(文件,类,任何最符合逻辑的)。
0

在主程序中只需要一个HWND,这是主窗口。

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

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

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

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

+0

感谢您的提示。当你说“只有一个HWND”时,我有点困惑,因为所有的公共控件和它们的各种API都创建/需要'HWND'对象。如果可能的话,我试图避免在入口点前面堆积50个'HWND'变量...... – Ben