• 一个可见又不可见的窗口


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

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

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

    为什么?

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

    >> 请移步至 topomel 查看图片 <<


    如果指定的窗口、其父窗口、其父窗口的父窗口等具有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?》

     

  • 相关阅读:
    基于springboot的校园跑腿平台
    【LIN总线测试】——LIN主节点网络管理测试
    springBoot--web--http缓存机制测试
    这个编辑器即将开源!
    枚举算法刷题笔记
    WSL中ubuntu安装mysql数据库
    测试用例的编写(面试常问)
    数字化转型企业成功的关键,用数据创造价值
    【Linux】进程(6):环境变量
    河南分销小程序开发都有哪些功能?
  • 原文地址:https://blog.csdn.net/mmxida/article/details/127419363