當前位置:編程學習大全網 - 圖片素材 - 父窗口Parent和窗口擁有者Owner的區別

父窗口Parent和窗口擁有者Owner的區別

概念和區別

在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自動銷毀。

另外,窗口之間消息的傳遞也和窗口關系有關,通常,壹個窗口會把自己的通知消息發送給它的父窗口,但不全是這樣,比如,CToolBar發送通知消息給它的所有者窗口而不是父窗口。這樣以來,就可以允許工具條作為壹個窗口(比如壹個 OLE 容器程序窗口)的子窗口的同時,能夠給另壹個窗口(比如in-place框架窗口)發送消息。至於某類窗口到底是把消息發送給誰,是父窗口還是所有者窗口,microsoft並沒有明示。還有,在現場(in-place)編輯的情況下,當壹個 server 窗口激活或者失效的時候,框架窗口所擁有的子窗口自動隱藏或者顯示,這也是通過直接調用SetOwner函數實現的。

  • 上一篇:WTO進展緩慢的原因
  • 下一篇:王識賢拍過什麽電視劇
  • copyright 2024編程學習大全網