Winapi-如何组织许多HWND对象

WinAPI - how to organize lots of HWND objects?

本文关键字:HWND 对象 许多 何组织 Winapi-      更新时间:2023-10-16

当我向前推进我的第一个winapi UI时,我发现自己在winmain文件中创建了大的,不舒服的hwnd变量:

HWND foo;
HWND bar;
HWND baz;
HWND etc;
int WINAPI WinMain(...) {}

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

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

这是应该发生的事情,还是有一种更实用的方式来组织此?

您有一些解决方案,具体取决于您的程序。

  1. 您可以将所有这些手柄放在一个或多个容器中,例如std::vector
  2. 您可以像克里斯的建议一样映射它们。
  3. 如果您的程序变得很大,则可能需要将它们组织成逻辑单元。例如,如果其中15个窗口是您的逻辑的一半,而另一个窗口则是另一半(例如在选项卡中的控件))。

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

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

然后,另一个窗口是主窗口的孩子(内部),或者是主窗口"拥有"的窗口。一般来说。特别是对于有史以来的第一个Windows程序。:-)因此,您不需要这些窗口的单独变量。每当窗口应对某件事做出反应时,这是给窗口的消息,这意味着用相关窗口句柄作为参数的一个函数调用您的功能。

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

但是,随着您的领先,您将需要将状态与每个窗口相关联,而最简单的方法是使用Windows"子分类" API将指针与每个窗口相关联。然后,您可以将窗口过程调用到关联的C 对象上的方法。可以将不同的消息进一步路由到不同的消息处理方法,每个消息都可以访问Window的状态(只是此C 对象)。