說說 HWND_TOP 和 HWND_TOPMOST 的區別

漫漫開發路 發佈 2023-05-24T23:21:17.710305+00:00

初看上去,HWND_TOP 和 HWND_TOPMOST 有點類似,但是實際上在調用 DeferWindowPos 或者 SetWindowPos時,它們之間的差別還挺大。在同級窗口的維護機制中,有一個概念叫做 Z 序 (Z-order) 。

初看上去,HWND_TOP 和 HWND_TOPMOST 有點類似,但是實際上在調用 DeferWindowPos 或者 SetWindowPos時,它們之間的差別還挺大。

在同級窗口的維護機制中,有一個概念叫做 Z 序 (Z-order) 。出於此討論的目的,頂級窗口也被視為同級窗口。事實上,大多數人在說」Z 序」時想到的正是頂級窗口的 Z 序。

Z 序應可視化為窗口的垂直堆棧,具體來說,就是哪個窗口在上方,哪個在下方。
在 Windows 3.0 版本之前,窗口的排序規則還是挺簡單的:HWND_TOP 標誌將會將它指定的窗口設定到窗口 Z 序的最上面。

Windows 3.0 版本開始,系統增加了」最頂層」窗口(Topmost)的概念。這些是始終保持」高於」非最頂層窗口的頂級窗口。要使窗口最頂層,請調用 DeferWindowPos(或其等價函數),HWND_TOPMOST 作為 hWndInsertAfter 參數的值。若要使窗口不在最頂層,請使用 HWND_NOTOPMOST。

由於引入了」最頂層」窗口,HWND_TOP 現在使窗口」 在 Z 順序中儘可能高,同時不會違反最頂層窗口始終出現在非最頂層窗口上方的規則」。這在實踐中意味著什麼?

> 如果窗口位於最頂部(topmost),則 HWND_TOP 將其置於 Z 順序的最頂部。

注意:上面的討論完全忽略了所有者和擁有窗口的問題。我省略了它們,因為它們會增加一層複雜性,分散主要話題的注意力。

總結

在實際體驗中,我發現 topmost 窗口會給一些用戶帶來困擾,所以,在實際開發中,沒有特殊的理由,我一般不使用 topmost。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平台開發者來說,確實十分有幫助。
本文來自:《What’s the difference between HWND_TOP and HWND_TOPMOST?》

關鍵字: