Win32-子窗口-父窗口-窗口所有者
文章目录
- 1.窗口关系
- 2.窗口类型的说明和限制
- 3.几个相关函数的说明
- 4.作者答疑
在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表。系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口。这个数据结构中有四个数据用来构建list,即child、sibling、parent、owner四个域。
1.窗口关系
窗口之间的关系有两种: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属性不会变。
2.窗口类型的说明和限制
(1)控制台窗口(desktop window)。这是系统最早创建的窗口。可以认为它是所有 WS_OVERLAPPED 类型窗口的所有者和父窗口。
(2)WS_OVERLAPPED类型的窗口可以显示在屏幕的任何地方。它们的所有者窗口是控制台。 当系统 shuts down的时候,它将销毁所有overlapped类型的窗口。
(3)WS_POPUP类型的窗口可以显示在屏幕任何地方,它们一般没有父窗口,但是如果明确调用SetParent,这类窗口也可以有父窗口。 WS_POPUP类型的窗口的所有者是在CreateWindow函数中通过设置hWndParent参数给定的,如果hWndParent不是子窗口,则该窗口就成为这个新的弹出式窗口的owner,否则,系统从hWndParent的父窗口向上找,直到找到第一个非子窗口,把它作为该弹出窗口的owner。当owner窗口销毁的时候,系统自动销毁这个弹出窗口。
(4)所有者窗口(owner)只能是 overlapped 或者 pop-up 类型的窗口,子窗口不能是所有者窗口,也就是说子窗口不能拥有其它窗口。overlapped 或者 pop-up 类型的窗口在拥有其它窗口的同时,也可以被拥有。在使用CreateWindowEx创建 WS_OVERLAPPED 或者 WS_POPUP类型的窗口时,可以在 hwndParent 参数中给出它的所有者窗口的句柄。如果 hwndParent 给出的是一个child 类型的窗口句柄,则系统自动将新创建窗口的所有权交给该子窗口的顶级父窗口。 在这种情况下,参数hwndParent被保存在新建窗口的parent域中,而它的所有者窗口句柄则保存在owner域中。
(5)缺省情况下,对话框和消息框属于 owned 窗口,除非在创建它们的时候明确给出了WS_CHILD属性,(比如对话框中嵌入对话框的情形)否则由系统负责给它们指定owner窗口。需要注意的是,一旦创建了owned类型的窗口,就无法再改变其所有关系,因为WIN32没有没有提供改变窗口所有者的方法。 而且在Win32中,由于有多线程的存在,所以要注意保证父子窗口或者owner/owned 窗口要同属于一个线程。
(6)对于 WS_CHILD类型的窗口,它的父窗口就是它的所有者窗口。 一个子窗口的父窗口也是在CreateWindow函数中用hWndParent参数指定的。子窗口只能在父窗口的客户区中显示,并随父窗口一起销毁。
3.几个相关函数的说明
GetWindow(hWnd, GW_OWNER)永远返回窗口的所有者(owner)。
对于SetParent,msdn里面说明了父子窗口必须是同一个进程的。但是由于窗口句柄是系统全局唯一的,不属于同一个进程的情况下,也可以成功调用,但是后果未知。GetParent的返回值比较复杂,对于overlapped类型的窗口,它返回0,对于WS_CHILD类型,它返回其父窗口,对于WS_POPUP类型,它返回其所有者窗口,如果想得到创建它时所传递进去的那个hwndParent参数,应该用GetWindowWord(GWW_HWNDPARENT)函数。
GetWindowWord(hWnd, GWW_HWNDPARENT)返回一个窗口的父窗口,如果没有,则返回其所有者。
4.作者答疑
如有疑问,敬请留言。
Win32-子窗口-父窗口-窗口所有者相关推荐
- Win32子窗口及其创建应用
简介: 所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口.子窗口也是窗口,它有自己的回调函数.自己的窗口类.自己的创建.它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性.子 ...
- mysql怎么创建窗口应用程序,Win32子窗口及其创建应用
简介: 所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口.子窗口也是窗口,它有自己的回调函数.自己的窗口类.自己的创建.它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性.子 ...
- pyqt 子窗口控制主窗口绘图_实战PyQt5: 005-主窗口QMainWindow
QMainWindow简介 在桌面应用中,一个应用软件通常都会包含一个主窗口,主窗口是承载所有控件的窗体, 在PyQt5中常用的主窗体有两种QMainWindow和QDialog,他们也都继承自QWi ...
- layer常用功能-子页面关闭当前窗口-执行子页面方法-方法回调
1 子页面关闭当前窗口 1.1 获取当前窗口索引,关闭 var index = parent.layer.getFrameIndex(window.name); parent.layer.close( ...
- mfc 子窗口 跟随 主窗口
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://shujiantang.blogbus.com/logs/29644154.html 前不久做了一个MFC项目.项目做完 ...
- pyqt5子窗口跳出主窗口_弹出式窗口与 可用性,转换和跳出率
pyqt5子窗口跳出主窗口 Written by Cassandra Naji 由卡珊德拉·纳吉 ( Cassandra Naji)撰写 They go by many names - modal w ...
- 如何隐藏win32 console application的console窗口
如何隐藏win32 console application的console窗口,因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译 器的链接开关选项(也就是linker选项). 首先 ...
- 给Win32 GUI程序增加控制台窗口的方法
给Win32 GUI程序增加控制台窗口的方法 2008年10月11日 星期六 下午 04:43 在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用Messag ...
- python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...
注意主窗口一定要为tk.Tk(),在主窗口上通过button的点击相应子函数创建子窗口,注意此时创建出来的窗口必须是Toplevel,否则出错. 至于用图片在窗口上绘图,则按代码所示即可. # -*- ...
最新文章
- java在线编程题_阿里笔试题(2017在线编程题)-- 数串分组 --Java实现
- 判断一个点是否在多边形区域内--C算法
- sql server 2005 T-SQL CEILING (Transact-SQL)
- svn 文件状态标记含义
- kvm linux重置密码,kvm虚拟机操作相关命令及虚拟机和镜像密码修改
- PHP页面间参数传递的四种方式
- Http请求处理流程
- 关于数据库查询优化的思考
- Mysql优化(出自官方文档) - 第五篇
- 【转】VNode节点
- Jmeter压力测试-微信小程序
- 饭店计算机软件系统FIDlLIL,酒店Opera系统研究
- 国内使用php谷歌翻译_中英文谷歌翻译-PHP
- electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)
- ResizeObserver loop limit exceeded报错解决方案
- 【超详细】MySQL零基础入门实战
- 如何快速删除pdf中某一页?
- u-boot启动流程分析
- 样式和主题(Style and Theme)详解
- Unity网格系统(1)网格生成