一个可见又不可见的窗口

2022年10月20日08:06:18 热门

今天,我们来讲一个脑筋急转弯。
考察下面的两行代码,看看你的第一感觉是什么?

ShowWindow(hwnd, SW_SHOWNORMAL);
assert(IsWindowVisible(hwnd));

我们通过第一行代码显示了一个窗口,此时,按照常识,这个窗口一定是可见的,对吧?
但是,第二行的断言有可能会触发(即使是在没有多线程的场景下)。

为什么?

答案如下。
请先看看 MSDN 对于 IsWindowVisible 的描述:

一个可见又不可见的窗口 - 天天要闻


如果指定的窗口、其父窗口、其父窗口的父窗口等具有WS_VISIBLE样式,则返回值为非零。否则,返回值为零。

WS_VISIBLE样式指示此窗口在其父窗口中可见。但父级本身可能不可见,在这种情况下,IsWindowVisible 将返回 FALSE。

另外还需要注意的地方是,如果窗口被其他窗口覆盖或者被它的父窗口剪裁(clippped)了,虽然此时窗口在屏幕上看不到,但是因为 IsWindowVisible 只是检查窗口是否设置了 WS_VISIBLE 样式,所以,此时 IsWindowVisible 依然会返回 TRUE。

总结

这篇文章,再次凸显了对于系统底层理解的重要性。
知道怎么做,并能明白其中的道理,会让人感觉踏实。
Win32 中各种知识点浩如烟海,如果你是一个热爱真理的孩童,请跟着我一起,砥砺前行。
“勿在浮沙筑高台”

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《When is a window visible yet not visible?》

一个可见又不可见的窗口 - 天天要闻

热门分类资讯推荐

曾小贤的上司Lisa榕,现实中不仅才貌双全,还嫁给了CEO - 天天要闻

曾小贤的上司Lisa榕,现实中不仅才貌双全,还嫁给了CEO

曾小贤的上司Lisa榕,现实中不仅才貌双全,还嫁给了CEO虽然说《爱情公寓》这部剧在剧情上充满了争议,但是一定程度上,这部剧也是很多人的回忆,是伴随了一代人的青春回忆,而且剧中的很多角色都成为了经典,他们的口头禅也一直被拿来玩儿梗。
Lisa榕做主持多年没红,被陈赫拉进爱情公寓爆红,如今怎样了 - 天天要闻

Lisa榕做主持多年没红,被陈赫拉进爱情公寓爆红,如今怎样了

谈到《爱情公寓》这部火爆一时的欢乐喜剧,大家肯定都不陌生。不知道大家是否还记得《爱情公寓》中那个把曾小贤治得服服帖帖的女上司Lisa榕,现实中的她名叫榕榕,和剧中的形象也判若两人。1981年出生在辽宁沈阳的榕榕,毕业于上海戏剧学院,后来成为了上海东方传媒集团有限公司的一名主持人。