GetHostWnd() 与 GetActiveWindow() 的用法区别

来源:互联网 发布:淘宝虚拟物品怎样退款 编辑:程序博客网 时间:2024/06/08 19:37

一、引言

最近工作中遇到了一点小问题:

首先我在主窗口上创建了两个子窗口,然后想要让其中的一个子窗口置顶。

但是很无奈,使用了 SetWindowPos() 方法怎么都置不了顶,反而还被另外一个子窗口一直压在下面;

更奇怪的是:当我切换了其他程序后,再切换回来,我想要置顶的子窗口就置顶了。

这是一个奇怪的问题,最后在老大的帮助下解决了这个问题。

是因为我在主窗口下创建子窗口时,使用了:

GetHostWnd()

函数来设置 CreateWindow() 函数中的父窗口句柄;

这里更换成为:

GetActiveWindow()

函数就可以了。

二、让我们深入探索:为什么将 GetHostWnd() 更换成 GetActiveWindow() 就可以了

解决了问题并不代表一切,我们仍然需要去研究为什么。

那么,这是为什么呢?

这里我们来查看下 MSDN 对于这两个函数的解释:

GetHostWnd() 函数
CWnd* GetHostWnd();

返回指向主窗口的指针。

GetActiveWindow() 函数
static CWnd* PASCAL GetActiveWindow();

返回指向当前活动窗口的指针。

尤其是注意这里 MSDN 对于 GetActiveWindow() 函数的解释:

The active window is either the window that has the current input focus or the window explicitly made active by the SetActiveWindow member function.

翻译如下:

活动窗口是指拥有输入焦点的或者是由 SetActiveWindow 函数明确指明为活动窗口的窗口。

那么,这里之前的问题就迎刃而解了。

之前我在主窗口中,已经让第一个子窗口置顶了;此时,我继续设置了主窗口为第二个子窗口的父窗口,导致第二个子窗口根据主窗口为基点,显示置顶,然而还是被第一个子窗口盖住了。

为什么呢?因为当前的活动窗口并非是主窗口,活动窗口是第一个子窗口,所以此时第二个子窗口无法显示置顶。

那么此时,我只需要将当前的活动窗口(也就是第一个子窗口获取到)设置为第二个子窗口的父窗口,在活动窗口的基点上进行第二个子窗口的置顶操作,就可以完成预想的功能了。

三、总结

有时候我们在开发过程中遇到的几个容易混淆的函数,看似功能差不多,其实蕴含了深刻的底层的知识。

面对这样的函数,我们需要做的就是力求甚解。甚至在很多时候,我更加推崇直接看对应技术的官方文档(英语是很重要的)。

很久没更新博客了,依然在路上。

To be Stronger.

0 0
原创粉丝点击