2009-10-09 45 views

回答

26

涉及到許多與人密切相關的概念,甚至在官方文檔中也經常濫用相關術語。

重要類型的窗口:

  • 頂層窗口:窗口沒有父窗口。應用程序的主窗口幾乎總是一個頂級窗口。它與z順序沒有任何關係。

  • 子窗口:父窗口包含的窗口。他們的位置總是與父母的遺relative區域相關。子窗口通常是「控件」:UI按鈕和編輯框等。

  • 父窗口:有子窗口的Windows。頂級窗戶通常有孩子。但請注意,兒童窗戶也可能有孩子,因此既可以是父母窗口,也可以是兒童窗口。

  • 擁有的窗口:由另一個窗口控制的窗口,但不一定是其他窗口的子窗口。一個例子是浮動工具調色板:它由應用程序中的另一個窗口擁有,但它並未鎖定到該窗口的其他區域。

  • 擁有者窗口:擁有擁有窗口的Windows。

通常的業主/資關係和父/子關係之間的區別並不重要,所以家長和孩子而言通常用於兩種情況下,即使是在文檔。在某些情況下,父字段和參數被重載以表示父母和/或所有者。

重要概念:

  • 頂部z順序的:這字面意思,顯示上述其他窗口的窗口。

  • 活動窗口:模糊概念,但它通常意味着頂層窗口用戶會認爲「當前」窗口。活動窗口通常用特殊的邊框繪製,並且任務欄上的圖塊高亮顯示。活動窗口通常位於或接近所有其他頂級窗口中z順序的頂部,並且它是具有鍵盤焦點的窗口的父級或所有者(可能是間接的)。

  • 鍵盤焦點:表示將接收鍵盤消息的窗口。從概念上講,有一個窗口的鍵盤焦點。有焦點的窗口常常是活動窗口的孩子(或孫輩等)。

  • 前景:活動窗口通常位於前景中。該名稱似乎暗示它位於z順序的頂部,但它確實意味着創建該窗口的線程獲得輕微的優先級提升。該活動窗口通常也是前景窗口。

因此,假設您已打開此瀏覽器窗口,並且您還有一個記事本實例正在運行。如果您在記事本中單擊該文檔,則會發生一連串的消息和狀態更改。你實際上點擊了一個大的編輯框,它是記事本頂層窗口的子窗口。該點擊會導致編輯框被激活,但子窗口不能真正成爲「活動」窗口,因此只需鍵盤焦點並通過其祖先傳遞激活消息,直到它進入頂層窗口。頂層窗口「激活」是通過移動到z順序的頂部,突出顯示其邊界等。它也變成了前景窗口,所以它的線程得到了一些提升,使得UI比其他任何其他視窗。

考慮到這些條款,您可以解析您列出的功能的MSDN描述以梳理出細微的差異。

如果你試圖佈置你的窗口的孩子,只需使用SetWindowPos(或MoveWindow,SizeWindow和ShowWinow)。在其餘函數中,SwitchToThisWindow看起來不贊同,基本上與SetForegroundWindow相同。 (請注意,在許多情況下,除非您是活動應用程序或活動應用程序授予您使用它的權限,否則SetForegroundWindow將不會執行您想要的操作。)BringWindowToTop主要是將窗口置於z-順序(你可以使用SetWindowPos來完成),如果你在頂層窗口調用它,會產生額外的副作用,使其表現得像SetForegroundWindow。

更新: Raymond Chen發佈了clearer distinction between the active window and the foreground window。引用:

前景窗口的概念是當輸入被去同步化以便表達「真正的全局活動窗口」時引入的,與SetActiveWindow相反,它繼續引用本地活動窗口。

3

使用setwindowpos,如果你需要改變窗口的大小(不只是它的狀態)

使用showwindow改變窗口

使用bringwindowtotop的只是國家通過孩子來激活父窗口。如果你發送一個子窗口(也許是一個浮動工具欄),父母將被帶到最前面並且擁有焦點而不是孩子。

他們都有自己的位置,顯然有重複的功能,但每個事情只是做一點點不同,取決於你想做什麼。