窗口的z-order表明了在一堆堆叠的窗口中该窗口的位置。窗口的堆叠是沿着一条虚轴—Z轴,从屏幕里向外延伸的。在z-order顶端的窗口将会压在其他窗口上。在z-order底部的窗口将会被其他窗口所压。 系统在一个单一的表中维护z-order 。根据窗口是不是顶级窗口,父窗口,子窗口,系统把他们添加到z-order中。顶级窗口将会堆叠在所有非顶级窗口之上,不管它是否是活动窗口或者是前台窗口。一个顶级窗口拥有WS_EX_TOPMOST的风格。在z-order中的所有的顶级窗口都会在任何非顶级窗口之前显现。一个子窗口会归入它父窗口的z-order中。 当一个应用程序创建一个窗口时,系统会把它放置在同一类窗口的z-order的顶部。你可以用 BringWindowToTop 函数将一个窗口置于同一类窗口的z-order的顶部。你可以通过 SetWindowPos和DeferWindowPos 函数重新排序z-order。 用户可以通过激活一个不同的窗口来改变z-order。活动的窗口会被系统放置在同类窗口的z-order的顶部。当一个窗口来到z-order的顶部,做自己的子窗口时。你可以用 GetTopWindow 函数去搜索父窗口的所有子窗口,并且返回一个指向z-order中最上边的子窗口的句柄。 函数可以检索句柄指向的下一个或前一个z-order中的窗口。

引用文章:z-order是什么

Z-order,也有人称为 Zorder,指的是对象之间的层次关系。举个简单的例子:在使用 PowERP oint 制作文件时,当你把文件上被其它对象盖住的某个对象「上推至最顶层」,你就是在改变它的 Z-order。通常 Z-order 高者置于 Z-order 低者的「上面」。

通常 GUI 程序设计都会用到 Z-order 的观念,所以 Borland OWL 有 Z-order,Java AWT 有 Z-order,Java Swing 也有 Z-order。这些 GUI 链接库都提供了良好的 Z-order 自动管理机制,贴心地帮我们管理 Z-order,大部分的情况之下,我们不会直接使用到 Z-order。但是,当你需要处理到对象之间的层次关系时,如果你不知道 Z-order,你可就麻烦了。我曾经用 Java 设计过一个简单的 UML 绘图软件,当时并未善加使用 Swing 的 Z-order 管理机制(即 JLayeredPane),结果多写了好些程序代码就只是为了控制层次关系。这篇文章简单地为您介绍 Java 的 Z-order 观念以及 JLayeredPane,希望你不要重蹈我的覆辙。

许多 Swing 的书都会再三告诫读者,「尽量不要」混合使用 Swing 和 AWT 的组件,原因就在于 Swing 和 AWT 的 Z-order 系统是不一样的。Swing 组件大都是 lightweight 的,而 AWT 的组件则一律是 heavyweight 的。我有个不错的比喻:Swing 组件是在 AWT 组件之内径自切割出来的层次,就好比 green thread 是在 process 之内径自切割出来的排程单位。你可能会问:「现在 green thread 已经「进化」成 native thread 了,以后 Swing 的 Z-order 会不会也「进化」成和 AWT 的 Z-order 同地位?」我认为不会,因为如果这样做的话,Swing 组件都必须继承自 AWT 组件,而目前 Swing 正致力于减少 CPU 和内存资源的消耗量来提升速度,所以不可能还走回头路 heavyweight 化。

AWT 和 Swing 的 Z-order 规则一样,如下:

  1. 组件的 Z-order 一定比其容器来得高,组件一定位于容器上层。
  2. 同一个容器的两个组件中,越早加入容器者其 Z-order 越高,位置越上层。

但是如果混合使用 AWT 和 Swing,上述第二条规则就不一定了。比方说,在某容器内先加入一个 Swing 的组件,再加入一个 AWT 的组件,且此二组件有重叠的区域,结果却是 AWT 组件出现在 Swing 组件上面。这并未遵守第二条的规定,因为此例同时使用了 AWT 和 Swing,Swing 组件被当成和容器同一个层,AWT 组件则是容器上一层。

在六个标准的 layout(包括 BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout、以及 BoxLayout)管理之下,容器的组件之间不会重叠(甚至连 CardLayout 管理之下也是如此,因为 CardLayout 只是逻辑上组件重叠,但实际上的做法是一次只有一个组件被设为 visible),所以大多数情况下 Z-order 并不会影响外观。但是当组件之间有重叠的情况发生时,你就要特别注意了,这些包括了:
˙ 将 layout 设为 null,由程序自行控制组件的 layout,而且允许组件重叠的话,你不可以同时使用 AWT 和 Swing 的组件。
˙ JInternalFrame、JScrollPane、JLayeredPane、JDesktopPane… 等容器会以重叠的方式放置组件,你不可以同时使用 AWT 和 Swing 的组件。
˙ 当使用 pop-up menu 时,此 menu 的容器如果有 heavyweight 的组件,那么你必须让此 pop-up menu 为 heavyweight,否则此 pop-up menu 可能会被盖住。呼叫 JPopupMenu.setLightWeightPopupEnabled(false) 即可让以后产生的 pop-up menu 都是 heavyweight 形式的。

前面提到,越早加入某容器的组件,其 Z-order 越高。除了 remove 再 add 之外,想改变 Z-order,你别无它法。但是如果你真的需要改变某容器的组件之 Z-order,那么你可以改用 javax.swing.JLayeredPane 当作容器,因为 JLayeredPane 提供了许多让你可以改变组件 Z-order 的 method。

对于 JLayeredPane 来说,Z-order 由两部分组成,分别是 layer 和 position,两者都是整数值。某组件的 layer 数目越高,表示位于越上层。如果两个组件位于同一个 layer,则 position 数目越低者位于越上层。关于 JLayeredPane,请看 O’Reilly 出版的「Java Swing」一书 223~231 页。

引用文章:探究 Z-Order

窗口的z-order是什么?PyQt5相关推荐

  1. linux 窗口z order,wxPython窗口z-order设置

    使用wxpython写的界面程序其实也是可以设置Z-order的. 可以使用pywin32模块调用win32的API实现,使用方法不在赘述. 如果仅仅是想将窗口置顶(放在其他窗口上面,Z-order顶 ...

  2. qt设置顶层窗口_Python快速入门系列:PyQt5 快速开发GUI-窗口类型以及主窗口创建...

    QMainWindow, QWidget, QDialog三个类都是用来创建窗口的,可以直接使用或继承后再使用.QMainWindow窗口可以包含菜单栏.工具栏.状态栏.标题栏等,是最常见的窗口形式, ...

  3. MFC SetWindowPos 窗口 的 Z 序

    函数原型: BOOL CWnd::SetWindowPos ( const CWnd* pWndInsertAfter, //插入的地方 int x, //水平坐标 int y, //垂直坐标 int ...

  4. setwindowpos怎么改变z序_MFC SetWindowPos 窗口 的 Z 序

    函数原型: BOOL CWnd::SetWindowPos ( const CWnd* pWndInsertAfter, //插入的地方 int x, //水平坐标 int y, //垂直坐标 int ...

  5. Windows窗口分析

    (本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...

  6. windows窗口分析,父窗口,子窗口,所有者窗口

    (本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...

  7. Android WindowManagerService机制分析:窗口的显示层级

    WindowManagerService(以下简称WMS)是Android Framework中一个重要的系统服务,用来管理系统中窗口(Window)的行为.Window是一个抽象的概念,它是一个矩形 ...

  8. windows消息机制详解-3

    1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...

  9. MoveWindow() SetWindowPos()的区别与联系

    敲代码时,突然发现有一个背景图片无法显示,百思不得其解,最终发现是MoveWindow() SetWindowPos()这两个函数的使用不当造成的. 这里把这两个函数的前世今生给分析一下. 先看Mov ...

最新文章

  1. 【NCEPU】韩绘锦:扩散卷积神经网络
  2. Makefile学习笔记 - 我的CPP之路 - C++博客
  3. Java中的I/O模型总结(八股文自述)
  4. 解决root用户不能打开Chromium网页浏览器
  5. fields在php中,phpmysqli_num_fields函数怎么用
  6. android 点击网络图片大全,android查看网络图片的实现方法
  7. stm32f103 rtc 获取 日历 时钟
  8. 基于LZ77算法的文件压缩
  9. 容联CTO许志强:AI、5G让通讯更智能、更高效
  10. 有类似split的命令吗_5分钟学linux命令之split
  11. 22.jsp动作元素
  12. 英文数据集txt_YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)
  13. iPhone的mysql客户端_适用于iPhone的MySQL C API库
  14. 3001基于哈夫曼树的数据压缩算法(附思路及注释)
  15. 特斯拉:CEO马斯克2020年总薪酬为零,2019年只有2万多美元
  16. python 和 的区别_Python中is和==的区别
  17. 加权最小二乘法matlab,加权最小二乘法matlab
  18. appium使用相对坐标定位元素
  19. 如何让linux自动调整时间同步,如何让Linux时间与internet时间同步(CentOS)?
  20. 小学计算机二课堂活动总结,信息技术第二课堂活动总结

热门文章

  1. 乐Phone:还原联想的联想
  2. 发布安全Web站点详细攻略:ISA2006系列之十四
  3. c++编码规范_Python02编码规范
  4. 【ABAP】OO ALV 概述
  5. 【视图】ABAP Views
  6. 用户创建自定义的参数ID
  7. 项目经理需要注意的四件事
  8. 实施hybris必须懂java吗
  9. 会计记忆总结之八:财务会计报告
  10. OO实现ALV TABLE 三:ALV的功能设计