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作為初始尺寸。