在windows系統中,每個視窗物件都對應有乙個資料結構,形成乙個list鍊錶。系統的視窗管理器通過這個list來獲取視窗資訊和管理每個視窗。這個資料結構中有四個資料用來構建list,即child(兒子)、sibling(兄弟)、parent(父母)、owner(本人)四個域。
所以我們可以看到,視窗之間的關係有兩種:owner-owned 關係和 parent-child關係。前者稱之為擁有/被擁有關係,後者稱之為父/子關係。在這篇文字中,我把owner視窗稱之所有者視窗。換句話說,乙個視窗在有乙個父視窗(parent)的同時,還可能被不同的視窗擁有(owner),也可以有自己的子視窗(child)。在mfc 的cwnd類中,所有者視窗儲存在m_hwndowner成員變數中,父視窗則儲存在m_hparent中,但是這兩個值並不一定和視窗物件資料結構中的值相對應。
視窗之間的關係,決定了視窗的外在表現。比如顯示、銷毀等。
如果乙個視窗資料的owner域非null,則它和該視窗建立了owner-owned 關係,擁有關係決定了:
(1)被擁有的視窗永遠顯示在擁有它的那個視窗的前面;
(2)當所有者視窗最小化的時候,它所擁有的視窗都會被隱藏;
(3)當所有者視窗被銷毀的時候,它所擁有的視窗都會被銷毀。
需要注意的是,隱藏所有者視窗並不會影響它所擁有的視窗的可見狀態。比如:如果視窗 a 擁有視窗b,視窗b擁有視窗c,則當視窗a最小化的時候,視窗b被隱藏,但是視窗 c還是可見。
如果乙個視窗的parent域非null,則它和該視窗之間就建立了parent-child關係。父子決定了:
(1)視窗在螢幕上面的顯示位置。父視窗提供了用來定位子視窗的座標系統,乙個子視窗只能顯示在它的父視窗的客戶區中,之外的部分將被裁減。這個裁減法則決定了如果父視窗不可見,則子視窗肯定不可見。如果父視窗移動到了螢幕之外,子視窗也一樣。
(2)當父視窗被隱藏時,它的所有子視窗也被隱藏。
(3)父視窗被銷毀的時候,它所擁有的子視窗都會被銷毀。
注意!最小化父視窗不會影響子視窗的可見狀態,子視窗會隨著父視窗被最小化,但是它的ws_visible屬性不會變。
windows系統為什麼要使用兩種關係呢?這是為了更加靈活的管理視窗。舉個例子:組合框(combobox)的下拉列表框(list box)可以超出組合框的父視窗的客戶區,這樣有利於顯示,因此系統建立該list box的時候,是作為控制台視窗(desktop window)的子視窗,它的父視窗hwndparent是null,這樣,list box的顯示區域是限制在整個螢幕內,但是該list box的所有者卻是組合框的第乙個非子視窗祖先(比如對話方塊),當它的所有者視窗銷毀後,該 list box自動銷毀。
另外,視窗之間訊息的傳遞也和視窗關係有關,通常,乙個視窗會把自己的通知訊息傳送給它的父視窗,但不全是這樣,比如,c*******傳送通知訊息給它的所有者視窗而不是父視窗。這樣以來,就可以允許工具條作為乙個視窗(比如乙個 ole 容器程式視窗)的子視窗的同時,能夠給另乙個視窗(比如in-place框架視窗)傳送訊息。至於某類視窗到底是把訊息傳送給誰,是父視窗還是所有者視窗,microsoft並沒有明示。還有,在現場(in-place)編輯的情況下,當乙個 server 視窗啟用或者失效的時候,框架視窗所擁有的子視窗自動隱藏或者顯示,這也是通過直接呼叫setowner函式實現的。
windows視窗關係
乙個視窗有很多方式關聯到使用者或者其它的視窗。乙個視窗可能是 自有視窗?前景視窗或者背景視窗。乙個視窗總有乙個 z序 用以關聯到其它視窗。什麼是 z序 下面會簡單的敘述一下 每個程序可以有多個可執行的執行緒。每個執行緒都可以建立視窗。乙個執行緒建立的了乙個視窗,並且這個視窗時使用者正在工作和使用的,...
WINDOWS視窗座標
不只是有最大最小關閉按鈕的那個矩形東西被稱為視窗,所有控制項是視窗。視窗中的子視窗是視窗。視窗的組成 外部邊框。視窗border屬性為 thin,resizing時,有3個畫素寬的邊框。系統區 視窗上部藍色部分,有最大最小關閉按鈕的那乙個部分。客戶區 除去外部邊框和系統區的部分。系統區有統一的機制處...
抓取WINDOWS視窗
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...