Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编写windows桌面应用程序时,应在何处跟踪窗口句柄? 我试图在C++中编写我的第一个Windows桌面应用程序,但是我对此很陌生,我不知道该如何跟踪我的子窗口的窗口句柄。_C++_Windows_Winapi - Fatal编程技术网

在编写windows桌面应用程序时,应在何处跟踪窗口句柄? 我试图在C++中编写我的第一个Windows桌面应用程序,但是我对此很陌生,我不知道该如何跟踪我的子窗口的窗口句柄。

在编写windows桌面应用程序时,应在何处跟踪窗口句柄? 我试图在C++中编写我的第一个Windows桌面应用程序,但是我对此很陌生,我不知道该如何跟踪我的子窗口的窗口句柄。,c++,windows,winapi,C++,Windows,Winapi,我遇到了一些丢失窗口句柄的问题,例如: 当接受来自多个轨迹栏的消息时,LPRAM会在消息中标识特定的轨迹栏,其中包含轨迹栏窗口的句柄。。。但是如果我不存储我的窗口句柄,那么我就不知道消息来自哪个轨迹栏 我应该将它们存储在全局变量中吗?这似乎不太安全 我是否应该创建一个结构或类来包装父窗口并存储窗口句柄等重要变量?如果是这样的话,我该怎么做呢?让我们从头开始 函数返回结果是有原因的。如果您忽略了API函数的结果,那么您现在就做错了!不管API函数是什么,如果有返回的结果,您不应该放弃它。它可以是需

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

当接受来自多个轨迹栏的消息时,LPRAM会在消息中标识特定的轨迹栏,其中包含轨迹栏窗口的句柄。。。但是如果我不存储我的窗口句柄,那么我就不知道消息来自哪个轨迹栏

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


我是否应该创建一个结构或类来包装父窗口并存储窗口句柄等重要变量?如果是这样的话,我该怎么做呢?

让我们从头开始

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

现在,一旦你得到了控制,并决定保持它,因为你应该的问题是如何。事实是,是否将其包装在一个类中是次要的决定。存储窗口句柄的最佳方法是将它们放在某种动态容器中。例如,std::vector


最后一个问题是如何从消息处理函数访问句柄容器。最简单的方法之一,尽管不是最优雅的方法,是将此向量设置为全局变量。比任何消息处理程序路由都更容易访问它。

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

如果主窗口创建子窗口,如所述轨迹栏,则轨迹栏HWNDs将作为主对象状态的一部分存储


实际上,这与任何其他程序体系结构问题没有什么不同,您需要设计程序,使所有需要的数据都暴露在需要的地方,但尽量将暴露限制在实际需要的地方。

可能将窗口包装在类中。我应该将它们存储在全局变量中吗?这似乎不太安全。全局变量通常不是一个好的选择。@drescherjm不同意您的三条评论。无处可供选择。所有窗口句柄都可以通过GetDlgItem和类似的函数进行遍历。您主要希望保存顶级窗口或将GWLP_USERDATA与SetWindowLongPtr一起使用。您可以将任意数据与窗口句柄SetWindowLongPtrwin、GWLP_USERDATA、ptr相关联。例如,您可以存储指向该窗口的C++对象的指针。因此,在文档开始时,我应该拥有所有窗口句柄的大向量。我如何跟踪哪个窗口的句柄?@johnymayhew“哪个”窗口是什么意思?句柄是一个窗口。例如,如果我想知道WM_HSCROLL消息来自哪个轨迹栏,以便正确处理消息并执行正确的功能。对于轨迹栏,您可以为它们分配GWLP_ID,或者使用对话框功能,如果从静态资源创建它们对您有效。然后WM_HSCROLL将具有lparam==轨迹栏句柄。您可以获取为此句柄分配的ID,这就是您了解消息来源的方式。窗口句柄不是对象。它们是引用对象的值。根据错误值检查这些值并可能确保窗口可见后丢弃这些值是正常的,这是一种常见做法。事实上,很少有人需要将窗口控制柄放在周围。通过使用编译时常量并将其指定为控件ID,可以保留大部分信息。除了弹出窗口外,每个窗口都有一个控件ID。如何将轨迹栏HWND存储为主对象的一部分?我是否需要为主窗口创建一个包装器对象,并在其中存储子HWND?还是有更简单的方法?