MFC窗口的父子關系和層級關系


  一直對窗口之間的關系有些混亂,遇到需要指定父窗口的函數時常常要考慮很久,究竟父窗口是哪個窗口,遂上網查資料,略有所悟,簡記如下:

        對話框中的所有控件(比如Button等)都是其子窗口。
        文檔/視圖結構中,框架窗口是視圖窗口的父窗口。
        同時在使用CreateWindow和CreateWindowEx時可以指定父窗口,建立窗口的父子關系。

另外,網上有篇文章講Windows窗口的層級關系,也頗清楚,故轉來備查:

一、windows窗口之間的關系包括所有與被所有關系,父子關系等。
       操作系統為每個窗口實例都分配一個內存空間,該空間被稱為窗口實例的信息結構。該結構包含了窗口實例的所有信息,其中有四個窗口句柄:1、本窗口實例的Z_Order順序最高的子窗口句柄;2、本窗口實例的下一個兄弟窗口的句柄(子窗口之間稱為兄弟窗口);3、本窗口實例的父窗口句柄;4、本窗口實例的所有者窗口句柄。
二、桌面窗口(第一層窗口)
        windows初始化時,首先創建一個桌面窗口,其他所有窗口都顯示在其上。::GetDesktopWindow()可以取得桌面窗口的句柄。桌面窗口位於系統窗口層次的最上層。
三、頂級窗口(第二層窗口)
       它沒有被設置為WS_CHILD風格的窗口,但它是桌面的子窗口。雖然頂級窗口之間存在兄弟關系,但它們之間可以建立一種所有與被所有的關系(所有者窗口和受控窗口)。受控窗口位於所有者窗口前段,即它的Z_Order順序可以被所有者窗口被激活而提高。所有者窗口最小化時,受控窗口被隱藏。當使用CreateWindow()和CreateWindowEx()創建一個頂級窗口時,參數hWndParent決定所有者窗口,若hWndParent為子窗口,則由系統搜索該子窗口的上級窗口,直到找到最近的頂級窗口,作為被創建窗口的所有者。
四、子窗口(第三層及其以下窗口)
       子窗口以同樣的方式和父窗口連接。決定頂級窗口之間的Z_Order順序的規則,同樣適合子窗口之間,即由擴展風格WS_EX_TOPMOST和窗口激活的先后順序共同決定。
五、重疊窗口與彈出窗口的區別
       它們都是頂級窗口。前者總有標題欄和邊框,並且總是自動設置WS_CLIPSIBLINGS風格。調用CreateWindow()和CreateWindowEx()創建重疊窗口時,可以指定默認的窗口尺寸參數,即CW_USEDEFAULT,由系統設置窗口的初始尺寸。彈出窗口同樣自動設置WS_CLIPSIBLINGS風格,但其他風格必須專門指定,不可以使用CW_USEDEFAULT作為初始尺寸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM