Winapi-如何组织许多HWND对象
WinAPI - how to organize lots of HWND objects?
当我向前推进我的第一个winapi UI时,我发现自己在winmain文件中创建了大的,不舒服的hwnd变量:
HWND foo;
HWND bar;
HWND baz;
HWND etc;
int WINAPI WinMain(...) {}
当然,这些变量在文件其余的函数中使用 - 例如,消息循环 - 因此它们必须可访问。
对于我相对较小的UI,我将堆积大约30个HWND,以便它们处于可见范围。这让我非常怀疑我做错了。
这是应该发生的事情,还是有一种更实用的方式来组织此?
您有一些解决方案,具体取决于您的程序。
- 您可以将所有这些手柄放在一个或多个容器中,例如
std::vector
。 - 您可以像克里斯的建议一样映射它们。
- 如果您的程序变得很大,则可能需要将它们组织成逻辑单元。例如,如果其中15个窗口是您的逻辑的一半,而另一个窗口则是另一半(例如在选项卡中的控件))。
您在主程序中只需要一个HWND,这是一个主窗口。
API不需要一个主窗口,但这是最常见的。即使从用户的角度来看,应用程序提供了几个明显独立的窗口,最好在程序中拥有一个主窗口(可能是无形的,但提供分组)。
然后,另一个窗口是主窗口的孩子(内部),或者是主窗口"拥有"的窗口。一般来说。特别是对于有史以来的第一个Windows程序。:-)因此,您不需要这些窗口的单独变量。每当窗口应对某件事做出反应时,这是给窗口的消息,这意味着用相关窗口句柄作为参数的一个函数调用您的功能。
每个子窗口都可以具有独特的整数ID,这是跟踪它们的一种方法。
但是,随着您的领先,您将需要将状态与每个窗口相关联,而最简单的方法是使用Windows"子分类" API将指针与每个窗口相关联。然后,您可以将窗口过程调用到关联的C 对象上的方法。可以将不同的消息进一步路由到不同的消息处理方法,每个消息都可以访问Window的状态(只是此C 对象)。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- Winapi-如何组织许多HWND对象
- Win32获取从窗口WNDProc发送事件的对象的HWND
- 删除 HWND 对象