一個可見又不可見的窗口

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年出生在遼寧瀋陽的榕榕,畢業於上海戲劇學院,後來成為了上海東方傳媒集團有限公司的一名主持人。