父窗口与物主窗口
父窗口与物主窗口
在windows形形色色的窗口家族中,每个窗口也只能是三种基本类型之一:
1. 重叠窗口(Overlapped)
2. 弹出窗口(Pupup)
3. 子窗口 (Child)
当调用CWnd的Create/CreateEx或是CDialog的Create创建一个基于以上三种类型之一的窗口时,会要求同时指定Parent或pParentWnd参数(以下统称Parent)。这其中涉及到了父/子窗口(CHILD & PARENT) 和 物主/从属窗口(CHILD & OWNER) 的概念差别。个人理解就像是父亲/儿子 同 监护人/养子 对之间的关系。其具体差别请参考以下行为列表。
1. 父/子窗口
若新创建的窗口类型为子窗口,则参数Parent须指定为其父窗口,且不能为NULL.
2. 物主/从属窗口
若新创建的窗口为重叠窗口或弹出窗口,参数Parent指定为其物主窗口,其值为NULL时,物主窗口为桌面窗口。
|
父/子窗口 |
物主/从属窗口 | ||
移动窗口 |
子随父 |
分离(两者无相互影响) | ||
显示位置 | 子在父内 | 分离 | ||
销毁窗口 | 子随父 | 从属随物主 | ||
隐藏 | 子随父 | 分离 | ||
父最小化 | 子被隐藏 | 从属被隐藏 | ||
子最小化 | 分离 | 分离 |
父/子窗口示例:子窗口无法“逃离”到父窗口之外
物主/从属窗口示例:从属窗口位置不受物主窗口约束
注:
1. 一个子窗口可能是另一个子窗口的父窗口,但绝不可能是一个物主窗口。如果试图使一个子窗口成为一个物主窗口,那么系统只能使那个子窗口的最顶层窗口作为物主窗口。
2. CWnd::SetParent 可改变父窗口。
3. CWnd::SetOwner 可改变物主窗口。
应用:
在基于对话框的应用程序中,若需要在多个对话框之间进行切换,可建立一个父窗口并将其它所有窗口作为其子窗口嵌入其中进行管理控制,以避免个对话框之间移动等问题。