天天看點

一個可見又不可見的視窗

今天,我們來講一個腦筋急轉彎。

考察下面的兩行代碼,看看你的第一感覺是什麼?

ShowWindow(hwnd, SW_SHOWNORMAL);

assert(IsWindowVisible(hwnd));

我們通過第一行代碼顯示了一個視窗,此時,按照常識,這個視窗一定是可見的,對吧?

但是,第二行的斷言有可能會觸發(即使是在沒有多線程的場景下)。

為什麼?

答案如下。

請先看看 MSDN 對于 IsWindowVisible 的描述:

>> 請移步至 topomel 檢視圖檔 <<

如果指定的視窗、其父視窗、其父視窗的父視窗等具有WS_VISIBLE樣式,則傳回值為非零。否則,傳回值為零。

WS_VISIBLE樣式訓示此視窗在其父視窗中可見。但父級本身可能不可見,在這種情況下,IsWindowVisible 将傳回 FALSE。

另外還需要注意的地方是,如果視窗被其他視窗覆寫或者被它的父視窗剪裁(clippped)了,雖然此時視窗在螢幕上看不到,但是因為 IsWindowVisible 隻是檢查視窗是否設定了 WS_VISIBLE 樣式,是以,此時 IsWindowVisible 依然會傳回 TRUE。

總結

這篇文章,再次凸顯了對于系統底層了解的重要性。

知道怎麼做,并能明白其中的道理,會讓人感覺踏實。

Win32 中各種知識點浩如煙海,如果你是一個熱愛真理的孩童,請跟着我一起,砥砺前行。

“勿在浮沙築高台”

最後

繼續閱讀