在编写Windows桌面应用程序时应在哪里跟踪我的窗口句柄?

时间:2019-04-08 14:47:15

标签: c++ windows winapi

我正在尝试用c ++编写我的第一个Windows桌面应用程序,但是我对此很陌生,我不知道该如何跟踪子窗口的窗口句柄。

我在丢失窗口句柄时遇到了一些问题,例如:

从多个跟踪栏接受WM_HSCROLL条消息时,lParam在消息中标识了特定的跟踪栏,其中包含跟踪栏窗口的句柄...但是,如果我不存储窗口句柄,则我不知道消息来自哪个跟踪栏!

我应该将它们存储在全局变量中吗?这似乎不太安全。

我是否应该创建一个结构或类来包装父窗口并存储重要变量(例如窗口句柄)?如果是这样,我将如何处理?

2 个答案:

答案 0 :(得分:3)

应该在对特定窗口有意义的位置跟踪窗口句柄。例如,如果您的程序只能创建一个主窗口类的实例,那么可能根本不需要存储该HWND(主窗口的对象存储状态是,但HWND本身不需要)。

如果该主窗口创建了子窗口(例如上述的跟踪栏),则跟踪栏HWND将作为该主要对象状态的一部分存储。

真的,这与任何其他程序体系结构问题都没有什么不同,您需要设计程序,以便将所有需要的数据公开在需要的地方,但是尝试将公开范围限制在实际上需要的地方。

答案 1 :(得分:-2)

让我们从头开始。

函数返回结果是有原因的。如果您忽略API函数的结果,那么您现在正在做错什么! API函数是什么都没有关系,如果返回结果,则不应丢弃它。它可以是进一步使用所需的对象,也可以是错误代码,或者同样有用的东西。当然,窗口句柄是非常有用的对象,您不应丢弃。

现在,一旦您确定了手柄并决定将其保持在附近(您应该使用),问题便是如何。事实是,是否将其包装在班级中是次要的决定。存储窗口句柄的最好方法是将它们放在某种动态容器中。例如,std::vector

最后但并非最不重要的一个问题是如何从消息处理功能访问此句柄容器。最简单的方法之一(尽管不是最优雅的方法)是使此向量成为全局变量。比任何消息处理程序路由都可以轻松访问它。