Window 中窗口的层次关系以及窗口的属性

Window 中窗口的层次关系以及窗口 了解窗口,了解微软的内部结构,数据结构 立即下载
Window 窗口层次关系
  相信在 Window 下面编程的很多兄弟们都不是很清楚Window 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Window 中桌面(Deskkop)以及顶层窗口,以及子窗口之间的关系。
  
  在Window 的图形界面下,最基本显示信息的元素就是窗口,每一个Window 窗口都管理着自己与其他窗口之间的关系和自身的一些信息,如:是否可见,窗口的所有者,窗口的父/子关系等等信息,当窗口创建、销毁、显示的时候,就会用到这些信息。
  
  在每一个窗口实例中,有四个元素被窗口管理器用来建立窗口管理链表。
  
  
 

  
  Child : 指向窗口子窗口的句柄
  Parent: 指向窗口父窗口的句柄
  Owner: 指向窗口所有者的句柄
  Next:  指向下一个同属窗口的句柄
  
  众所周知当Window 初始化的时候,它创建桌面这个窗口,桌面覆盖着整个窗口,窗口管理器用这个窗口作为窗口链表中第一个元素。因此桌面在窗口的层次关系中在最上层。
  
   在窗口层次关系中,桌面窗口下一层窗口叫做顶层窗口,顶层窗口就是那些不是子窗口的窗口,顶层窗口不能够有WS_CHILD 属性。窗口管理器是如何把桌面窗口和顶层窗口联系起来的呢?窗口管理器把顶层窗口都组织到一个链表中,而这个链表的头存储的就是桌面窗口的子窗口句柄,每 一个子窗口通过Next 就可以找到链表中下一个窗口了。这个链表被称为子窗口链表,在同一个子窗口链表中的窗口是互为同属窗口,所有顶层窗口都是同属窗口。窗口在子窗口链表中的 次序,也表明了窗口距离距离桌面窗口的距离。顶层窗口所形成的子窗口链表构成了一个Z 轴,窗口管理器就是根据Z 序列来觉得窗口的哪一部分是显示的,哪一部分是被遮盖的。
  
  所有顶层窗口的父窗口都是指向桌面窗口的,这样一来顶层窗口就好像是桌 面窗口的子窗口,所有顶层窗口构成的链表是桌面窗口的子窗口链表。当顶层窗口创建的时候,窗口管理器把顶层窗口放在Z 轴的顶上,这样使得整个窗口可见,窗口管理器把窗口插入到桌面窗口子窗口链表的前面。WS_EX_TOPMOST 这个属性控制着窗口管理器创建顶层窗口,窗口管理器把没有WS_EX_TOPMOST 属性的窗口放在具有WS_EX_TOPMOST 属性的窗口的后面,这样就使得具有WS_EX_TOPMOST 属性的窗口一直显示在前面。
  
  
 

  
  在顶层窗口之间还有另外一直关系,拥有或者属于其他的顶层窗口,属 于其他窗口的窗口叫做归属窗口,拥有其他窗口叫做宿主窗口,在Z 轴中,归属窗口一定在他的宿主窗口的前面,如果一个宿主窗口最小化,那么归属他的窗口会隐藏掉,如果宿主窗口隐藏起来,归属他的窗口不会被隐藏掉。如果有 三个窗口A、B、C ,A 拥有 B,B 拥有 C ,如果A 最小化,那么B 会隐藏,但是 C 还是可见的。怎么才能够在窗口之间建立所有关系呢?方法是在调用CreateWindow或者CreateWindowEx 创建窗口的时候,指定hwndParent 参数。
  
  
 

  
  桌面窗口是在窗口层次中的第一层,顶层窗口在窗口层次中的第二层,子窗口也就是那些创建的时候指定了WS_CHILD 属性的窗口占据了窗口层次的其他层。窗口和子窗口之间的联系,就像桌面窗口和顶层窗口之间的关系一样。
  
  

  
  户区域,所有同一个窗口的子窗口同样建立一个Z 轴,这个和顶层窗口是类似的,顶层窗口也是显示在其父窗口――桌面窗口的客户区域。
  
  16 位和32 位窗口系统的区别
  窗口之间的父子关系、归属所有关系、以及根据 Z 轴来显示的这些规则在16 位和32 位窗口系统中都是相同的。这样可以是在两种窗口系统中高度的兼容。两种窗口系统的区别在于安全和多线程。
  
   Window Nt 在原有的窗口层次关系中多增加了一层,每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有上面描述的那样的窗口关系。Window Nt 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。J 通常用户是不能够创建和删除桌面的,不过那是通常,实际上在Window 下面也可以实现类似 Linux 中的多个桌面的效果,每一个桌面都是一个独立的世界。
  
  两种窗口系统还有两位一个区别,在16 位窗口系统中不支持多线程,所以应用程序开发者在创建窗口的时候不必考虑线程的问题了。而在32 位窗口系统中由于又支持了窗口的父子关系,归属与拥有关系,同一个窗口下面的所有线程都拥有相同的一个输入队列,应用程序开发者应该明白输入队列是共享 的,在同一个时刻只能有一个线程处理消息,其他的线程都在等待输入队列一直到GetMessage 或者PeekMessage 返回,而且必须注意的是父窗口和子窗口或者是归属与拥有窗口共用同一个线程。
  
  在32 窗口系统中定义两种新的窗口类型,前台窗口和背景窗口,这两种窗口没有列到窗口的层次关系中,前台窗口就是用户当前操作的窗口,其他的所有窗口都是背景窗 口。 32 位窗口系统中支持两个函数来处理前台窗口SetForegroundWindow 和GetForegroundWindow。
  
  操作窗口列表
  下面是窗口列表操作的一些函数:
  
  EnumChildWindows
  
  使用这个函数得到一个窗口的所有子窗口,包括子窗口的子窗口。不过在列举的过程中这个函数不能够列出正在创建的或者销毁的窗口。
  
  EnumThreadWindows
  
  使用这个函数可以列出所有属于这个线程的窗口。在这个函数调用之后创建的窗口是不能够被列举出来的。
  
  EnumWindows
  
   使用这个函数列举出所有顶层窗口,不能够列举出子窗口,要列出所有的顶层窗口,使用这个函数比GetWindow安全。使用GetWindow 来列出所有的窗口,可能会导致程序无限循环,因为在调用GetWindow 的过程中,可能一些窗口已经销毁了。EnumWindows 不能够列举出调用这个函数之后创建的顶层窗口。
  
  FindWindow
  
  可以使用这个函数通过类名或者使用窗口的标题来找到顶层窗口,这个函数不能够用来找子窗口,这个函数不区分参数的大小写。这个函数在Z轴中寻找窗口,找到了之后,就会返回。
  
  GetDesktopWindow
  
  得到桌面窗口句柄
  
  GetNextWindow
  
  使用这个函数得到这个窗口的同属窗口,在16 位窗口系统中GetNextWindow 和GetWindow 是两个不同的函数,在32 位系统中这个函数是通过GetWindow 来实现的。
  
  GetParent
  
  如果一个窗口存在父窗口,那么可以通过这个函数得到窗口的父窗口,如果窗口是顶层窗口,则返回其所有者窗口句柄。
  
  GetThreadDesktop
  
  这个函数用来得到指定线程的所属的桌面窗口句柄,在win95 和 win98 下面由于不支持多桌面,每次调用该函数都返回同一个值。
  
  GetTopWindow
  
  可以用这个函数来得到给定窗口的第一个子窗口的句柄,如果传递给函数的参数是NULL 的话,那么这个函数将会返回最上面的顶层窗口。
  
  GetWindow
  
  应用程序可以调用这个函数来在窗口列表中导航,这个函数有两个参数,一个是窗口的句柄,另外是要得到的窗口句柄和这个窗口之间的关系。
  
  · GW_HWNDNEXT: 这个函数返回给定窗口的下一个同属窗口
  
  · GW_HWNDFIRST: 返回给定窗口的前一个同属窗口
  
  · GW_HWNDLAST: 返回给定窗口的最后一个同属窗口
  
  · GW_HWNDPREV: 返回给定窗口的第一个同属窗口
  
  · GW_OWNER: 返回给定窗口的所有者窗口句柄
  
  · GW_CHILD: 返回给定窗口的第一个子窗口句柄
  
  IsChild
  这个函数有两个参数,两个窗口句柄,判断两个窗口是否存在父子关系
  
  窗口的属性
  当应用程序调用CreateWindow 创建窗口的时候,我们必须为窗口指定属性,下面简要的介绍一下窗口的属性。
  
  WS_OVERLAPPED
   交迭属性是顶层窗口的一种属性,使用这种属性创建的窗口,会被链接到桌面窗口的子窗口链表中,应用程序通常使用这种属性的窗口作为应用程序的主窗口,具 有交迭属性的窗口通常具有有标题栏,即使是WS_CAPTION 这个属性没有指定。具有交迭属性的窗口通常都是有边框的,具有交迭属性的窗口可以拥有自己的顶层窗口,也可以所属其他的顶层窗口,所有的这类窗口都具有 WS_CLIPSIBLINGS 属性,即使是没有给窗口指定这个属性。
  
  WS_POPUP
  弹出属性也是应用到顶层窗 口的一种属性,使用这种属性创建的窗口会被链接到桌面窗口的子窗口链表中,应用程序通常为对话框窗口设置这个属性,弹出属性和交迭属性的主要区别在于具有 弹出属性的窗口不是一定要有标题栏的,而具有交迭属性的窗口则是一定要具有标题栏,具有弹出属性的窗口可以没有边框。和具有交迭属性的窗口一样,具有弹出 属性的窗口可以有自己的顶层所属窗口,也可以所属其他的顶层窗口。所有具有弹出属性的窗口必须具有WS_CLIPSIBINGS 属性,即使是用户没有指定这个属性。具有弹出属性的窗口在创建的时候,它的大小和位置不能够使用CW_USEDEFAULT 值。
  
  WS_CHILD
子窗口必须具有这个属性,子窗口只能够出现在父窗口的客户区域,这是子窗口和具有交迭属性的窗口以及弹出属性的窗口的主要区别,创建子窗口的时候,位置和大小不能够使用CW_USEDEFAULT这个值,否则是不能够创建窗口的。

WS_CAPTION

 

 当窗口被设置这个属性的时候,窗口的最上头会有标题栏,应用程序可以通过SetWindowText这个函数来改变标题栏的标题,通常具有标题栏 的窗口还具有最大、最小、关闭按钮,和系统菜单。如果一个窗口没有标题栏,那么Window是不会创建这些东西的,即使是用户指定了这些属性,系统菜单是 依赖标题栏窗口的存在而存在的,如果没有标题栏那么是一定不会有系统菜单的存在的。具有标题栏的窗口通常具有单线的边界具有可以改变窗口大小的属性,通常 具有标题栏的窗口是不能具有对话框的边界属性的,除非为窗口设置WS_EX_DLGMODALFRAME属性。 WS_MINIMIZEBOX

 
当为窗口设置这个属性的时候,窗口的标题栏上会有一个最小化的按钮,其实对于Window来实现这个属性的时候,只是在标题栏上面放置了一个最小化的位 图,当用户点击这个最小化位图的时候,窗口最小化,如果最大化位图最在,那么最小化位图被放置在最大化位图的左边。没有这个属性的窗口是不能够最小化的。

WS_MAXIMIZEBOX

 
当为窗口设置这个属性的时候,窗口的标题栏的右上会被放置一个最大化的位图,如果窗口设置了这个属性,用户可以点击最大化的位图或者是通过系统菜单来实现窗口的最大化,没有这个属性的窗口是不能够被最大化的。

WS_SYSMENU

 
如果为窗口指定这个属性,那么就会在窗口的左上角上放置系统菜单位图,系统菜单为用户提供了操作窗口的接口,通常系统菜单会有下面这些系统命令:

恢复最小化的窗口使用键盘移动窗口使用键盘改变窗口的大小最小化窗口最大化窗口关闭窗口切换到其他的任务

  •  
如果一个窗口有系统菜单,用户可以通过点击系统菜单图标来调用系统菜单,或者通过Alt+空格的快捷键调出系统菜单,或者通过点击任务栏上窗口的图标来调 出系统菜单,如果一个窗口没有系统菜单,那么用户不能够通过键盘来实现系统命令,除非应用程序自身提供了这样的接口。系统菜单对于最大化的窗口也是很有用 处的,最大化的窗口覆盖了整个屏幕,这样的窗口不能够被移动,除非恢复到不是最大化的状态,如果这个最大化的窗口有了系统菜单,则就不必一定恢复到非最大 化的状态才能够移动。

WS_HSCROLL

 
如果窗口被指定了这个属性,那么窗口会有一个水平的滚动条,窗口是不会自动的滚动滚动条的,如果应用程序要支持滚动条,那么必须自己处理WM_HSCROLL消息,这个属性通常是在窗口创建的时候,被指定的。 

WS_VSCROLL

 
如果窗口被指定了这个属性,那么窗口会有一个竖直的滚动条,窗口不会自动的滚动滚动条,应用程序必须自己处理WM_VSCROOL消息来处理滚动条滚动的消息,这个属性通常是在窗口被创建的时候指定的。

WS_BORDER

 
如果窗口被指定了这个属性,那么窗口会有一个单线的边在窗口的周围,如果没有指定这个属性,但是窗口具有标题栏,那么窗口会自动的拥有这个属性,如果窗口没有这个属性,拥有这个属性的窗口不能够通过键盘或者是鼠标改变窗口的大小。

WS_DLGFRAME

 
如果窗口被指定了这个属性,那么窗口具有对话框的边框,这个属性通常是用在对话框窗口的,只能够用在窗口没有标题栏的情况下,如果一个不是对话框的窗口使 用了这个窗口,那么窗口必须被指定WS_EX_DLGMODALFRAME属性。使用这个属性创建的窗口,不能够通过键盘和鼠标改变窗口的大小。

WS_THICKFRAME

 
当窗口被指定了这个属性,那么窗口会有一个可以改变大小的边框,这种属性通常用在程序的主窗口,具有这种属性的窗口的大小可以通过键盘或者鼠标来改变。

WS_CLIPCHILDREN

 
这个属性用在具有子窗口的窗口,使用这个属性,可以使Window把子窗口所占的区域拷贝到父窗口,而不是甴父窗口直接的画子窗口所属的区域,如果窗口没 有指定这个属性,那么那么父窗口会覆盖子窗口的区域。在一些图片显示或者OpenGL显示的窗口中,指定这个属性是很重要的。

WS_CLIPSIBLINGS

 
当窗口赋予这个属性,窗口在自绘的时候,不会绘制到同属的子窗口,所有具有交迭属性和弹出属性的窗口都具有这个属性,所有的顶层窗口都具有这个属性,这样一来顶层窗口在自绘的时候,不会绘制在到其他的顶层窗口。 

WS_VISIBLE

 
当窗口被设置这个属性的时候,窗口是可见的,默认的情况下,应用程序必须自己调用ShowWindow来显示窗口。

WS_DISABLED

 
当窗口被设置这个属性的时候,创建的窗口不能够接受用户的输入,除非应用程序自身提供方法来输入。这个属性通常用在Window控件上面。

WS_CHILDWINDOW

 
这个属性同WS_CHILD。

WS_OVERLAPPEDWINDOW

 
这个属性同WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,这个属性通常用在应用程序的主窗口。

WS_POPUPWINDOW

 
这个属性同WS_POPUP|WS_BORDER|WS_SYSMENU,尽管这个属性中包含了WS_SYSMENU属性,如果窗口没有WS_CAPTION属性,那么窗口也不会有系统菜单。

WS_EX_DLGMODALFRAME

 
当窗口设置了这个属性的时候,窗口具有对话框的边框,这个属性通常用在对话框窗口,不过任何窗口都可以使用这个属性来获得对话框的边框。

WS_EX_NOPARENTNOTIFY

 

这个属性是用在子窗口上的,当子窗口设置了这个属性,Window不发送WM_NOTIFY消息给子窗口的父窗口,默认情况下,Window会在子窗口创建或者销毁的时候发送WM_NOTIFY消息给子窗口的父窗口。WS_EX_TOPMOST

 
这个属性仅用在顶层窗口,对于子窗口设置这个属性是被忽略的,如果窗口设置了这个属性,那么窗口会一直在其他窗口的上面。

WS_EX_ACCEPTFILES

 
窗口设置了这个属性,那么窗口可以接受拖放的对象。

WS_EX_TRANSPARENT

 
这个属性能够使窗口透明,设置了这个属性的窗口的背景使可以被看到的,透明窗口对于鼠标和键盘的消息事件并不是透明的
Window 窗口层次关系 Window 窗口层次关系,本人根据自己的工作经验而总结,很适合初学者 立即下载

相关推荐

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2415

窗口分析

(本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++、Windows编程及MFC经验,还得有一定动手能力。文中可能出现一些术语不统一的现象,比如“子窗口”,有时候我写作“child window”,有时候写作“child”,我想应该不会有太大影响,文章太长,不一一更正了)问题开始于我的最近的一次开发经历,我打算把程序的一部分界面放在

*无名小卒* 1万+

利用ANSYS随机振动分析功能实现随机疲劳分析

本文介绍了ANSYS随机振动分析功能,以及利用该功能,按照Steinberg提出的基于高斯分布和Miner线性累计损伤定律的三区间法进行ANSYS随机疲劳计算的具体过程。在工程应用中,汽车、飞行器、船舶以及其它各种机械或零部件,大多是在随机载荷作用下工作,当它们承受的应力水平较高,工作达到一定时间后,经常会突然发生随机疲劳破坏,往往造成灾难性的后果。因此,预测结构或零部件的随机疲劳寿命是非常有必要的。在工程界,疲劳计算广泛采用名义应力法,即以S-N曲线为依据进行寿命估算的方法,可以直接得到总寿命。

qq_38220914的博客 7608

Android窗口层级(Window Type)分析

车载方案存在倒车等特殊界面需要在较高的窗口层级显示,Android原有的窗口层级不满足车载需求,因此都会自定义车载窗口层级。下图为参考自定义的窗口层级:android自定义窗口层级(自定义车载系统中倒车影像显示层级)自定义窗口层级在不同Android版本中的初始层级值也是不同,因此需要通过系统属性来判断初始值。例如在Android 13平台的默认属性为2401,在Andoid 9等平台为2031。这样做的目的是由于跟Android原生的窗口层级存在冲突,因此需要根据平台来调节初始值。

分享技术与经验的博客 1万+

文件上传漏洞攻击与防范方法

文件上传漏洞攻击与防范方法 文件上传漏洞简介: 文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。 文件上传漏洞危害: 上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者上传...

m0_38103658的博客 4万+

Ubuntu 22.04 LTS下Xenomai 3.3实时内核配置全攻略(附常见错误排查)

本文详细介绍了在Ubuntu 22.04 LTS系统上配置Xenomai 3.3实时内核的完整流程,包括环境准备、内核补丁应用、编译优化及常见错误排查。特别针对工业自动化和机器人控制场景,提供了性能优化建议和故障解决方案,帮助开发者实现毫秒级精度的实时任务处理。

weixin_29268385的博客 464

Android 窗口结构(一) 窗口层级构造

Android窗口是根据显示屏幕来管理,每个显示屏幕的窗口层级分为37层,0-36层。每层可以放置多个窗口,上层窗口覆盖下面的。要理解窗口的结构,需要学习下WindowContainer、RootWindowContainer、DisplayContent、TaskDisplayArea、Task、ActivityRecord、WindowToken、WindowStateWindowContainer等类。

q1165328963的博客 6711

PX4飞控CAN总线通信深度配置:从menuconfig到驱动加载的完整指南

本文详细解析了PX4飞控中CAN总线通信的深度配置流程,从menuconfig选项设置到驱动加载的完整指南。涵盖硬件抽象层、驱动层和应用层的配置细节,提供实际验证方法和故障排查技巧,帮助开发者高效实现CAN通信,特别适用于无人机和机器人底盘运动控制等场景。

weixin_30374009的博客 499

屏幕的窗口层级

表示将对应的layer设置为。

了凡 725

测试用例设计工具大盘点:总有一款适合你

本文旨在帮助测试工程师、开发人员及团队管理者快速了解主流测试用例设计工具的特点、适用场景和选择逻辑。覆盖工具类型包括传统文档工具、开源管理工具、商业集成平台及新兴AI工具,范围涵盖中小团队到大型企业的不同需求。本文从“测试用例设计的痛点”切入,用生活案例解释核心概念;接着按“工具类型”分类盘点主流工具(附优缺点对比表);再通过“小团队/中大型团队/敏捷团队”等真实场景教你选工具;最后展望AI等未来趋势,帮你“一次学透,终身受用”。

项目管理的博客 1590

【雕爷学编程】MicroPython手册之 Teensy 4.1 实时时钟 (RTC)

在类的初始化函数中,定义了用于控制I2C总线的i2c对象和RTC模块的I2C地址。接着,使用该引脚初始化了一个Pin对象。它还提供了8个串口,3个SPI端口,3个I2C端口,2个I2S/TDM数字音频端口,3个CAN总线(其中一个支持CAN FD),以及一个SDIO(4位数据)原生SD卡端口12。2、内存:Teensy 4.1配备了1024 KB的RAM(其中512 KB是紧密耦合的),8 MB的Flash(其中64 KB用于恢复和EEPROM模拟),以及两个位置可以选择添加更多的QSPI内存芯片。

雕爷学编程 575

windows程序窗口层次Z-order,顶层窗口,前台窗口,后台窗口,兄弟窗口,活动窗口

1.窗口Z次序:表明了重叠窗口堆中窗口的位置,这个窗口堆是按照一个假象的轴定位的,这个轴是从屏幕向外伸展的Z轴,上面的窗口覆盖下面的窗口。 2.Windows系统管理三个独立的Z次序----一个用于顶层窗口、一个用于兄弟窗口、还有一个用于最顶层窗口,最顶层窗口覆盖其他非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建最顶层窗口。 一般情况下,Win...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 3513

2025华为od机试真题B卷【停车场费用统计】Python实现

2025华为od机试真题B卷【停车场费用统计】Python实现

MISAYAONE的博客 535
上一篇: 我的益友良师:张毅
下一篇: 转载清华大学校长留给毕业生的一段话
QJC13
博客等级 码龄19年 9粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值