欢迎来到天天文库
浏览记录
ID:37713762
大小:92.50 KB
页数:11页
时间:2019-05-29
《Window 窗口层次关系》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Window窗口层次关系 相信在Window下面编程的很多兄弟们都不是很清楚Window中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Window中桌面(Deskkop)以及顶层窗口,以及子窗口之间的关系。 在Window的图形界面下,最基本显示信息的元素就是窗口,每一个Window窗口都管理着自己与其他窗口之间的关系和自身的一些信息,如:是否可见,窗口的所有者,窗口的父/子关系等等信息,当窗口创建、销毁、显示的时候,就
2、会用到这些信息。 在每一个窗口实例中,有四个元素被窗口管理器用来建立窗口管理链表。 Child: 指向窗口子窗口的句柄 Parent:指向窗口父窗口的句柄 Owner:指向窗口所有者的句柄 Next: 指向下一个同属窗口的句柄 众所周知当Window初始化的时候,它创建桌面这个窗口,桌面覆盖着整个窗口,窗口管理器用这个窗口作为窗口链表中第一个元素。因此桌面在窗口的层次关系中在最上层。 在窗口层次关系中,桌面窗口下一层窗口叫做顶层窗口,顶层窗口就是那些不是子窗口的
3、窗口,顶层窗口不能够有WS_CHILD属性。窗口管理器是如何把桌面窗口和顶层窗口联系起来的呢?窗口管理器把顶层窗口都组织到一个链表中,而这个链表的头存储的就是桌面窗口的子窗口句柄,每一个子窗口通过Next就可以找到链表中下一个窗口了。这个链表被称为子窗口链表,在同一个子窗口链表中的窗口是互为同属窗口,所有顶层窗口都是同属窗口。窗口在子窗口链表中的次序,也表明了窗口距离距离桌面窗口的距离。顶层窗口所形成的子窗口链表构成了一个Z 轴,窗口管理器就是根据Z序列来觉得窗口的哪一部分是显示的,哪一部分是被遮盖的。
4、 所有顶层窗口的父窗口都是指向桌面窗口的,这样一来顶层窗口就好像是桌面窗口的子窗口,所有顶层窗口构成的链表是桌面窗口的子窗口链表。当顶层窗口创建的时候,窗口管理器把顶层窗口放在Z轴的顶上,这样使得整个窗口可见,窗口管理器把窗口插入到桌面窗口子窗口链表的前面。WS_EX_TOPMOST这个属性控制着窗口管理器创建顶层窗口,窗口管理器把没有WS_EX_TOPMOST属性的窗口放在具有WS_EX_TOPMOST属性的窗口的后面,这样就使得具有WS_EX_TOPMOST属性的窗口一直显示在前面。
5、 在顶层窗口之间还有另外一直关系,拥有或者属于其他的顶层窗口,属于其他窗口的窗口叫做归属窗口,拥有其他窗口叫做宿主窗口,在Z轴中,归属窗口一定在他的宿主窗口的前面,如果一个宿主窗口最小化,那么归属他的窗口会隐藏掉,如果宿主窗口隐藏起来,归属他的窗口不会被隐藏掉。如果有三个窗口A、B、C,A拥有B,B拥有C,如果A最小化,那么B会隐藏,但是C还是可见的。怎么才能够在窗口之间建立所有关系呢?方法是在调用CreateWindow或者CreateWindowEx创建窗口的时候,指定hwndParent 参
6、数。 桌面窗口是在窗口层次中的第一层,顶层窗口在窗口层次中的第二层,子窗口也就是那些创建的时候指定了WS_CHILD 属性的窗口占据了窗口层次的其他层。窗口和子窗口之间的联系,就像桌面窗口和顶层窗口之间的关系一样。 户区域,所有同一个窗口的子窗口同样建立一个Z轴,这个和顶层窗口是类似的,顶层窗口也是显示在其父窗口――桌面窗口的客户区域。 16位和32位窗口系统的区别 窗口之间的父子关系、归属所有关系、以及根据Z轴来显示的这些规则在16位和32位窗口系统中都是相同的。
7、这样可以是在两种窗口系统中高度的兼容。两种窗口系统的区别在于安全和多线程。 WindowNt在原有的窗口层次关系中多增加了一层,每一个运行着WindowNT的系统中都有一个Window工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window工作站对象可以拥有一些桌面对象,每一个桌面都拥有上面描述的那样的窗口关系。WindowNt用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。J通常用户是不能够创建和删除桌面的,不
8、过那是通常,实际上在Window下面也可以实现类似Linux中的多个桌面的效果,每一个桌面都是一个独立的世界。 两种窗口系统还有两位一个区别,在16位窗口系统中不支持多线程,所以应用程序开发者在创建窗口的时候不必考虑线程的问题了。而在32位窗口系统中由于又支持了窗口的父子关系,归属与拥有关系,同一个窗口下面的所有线程都拥有相同的一个输入队列,应用程序开发者应该明白输入队列是共享的,在同一个时刻只能有一个线程处理消息,其他的线程都在等待
此文档下载收益归作者所有