【Qt记录】Windows 窗口层级(Z-order)

功能:软件有一个提示弹窗,希望让他永远在最上面,保证该窗口在任何情况下不会被遮挡。

由上面的问题就查找对应的api找到了SetWindowPos()。

在说这个函数之前,先了解以下概念:

Z-order(Z顺序)

其实这玩意翻译成 Z轴 更好。

首先对于显示器而言,以左上角为坐标原点,向右为x轴,向下为y轴。除此之外,由里向外就是z轴,也就是所谓的Z-order。

top of the Z order:Z轴的最顶层,虽然是Z序里最上面的,但它并不一定是最最上面的。

按照Z轴的顺序,由外向里,分别是:顶端窗口–顶层窗口–子窗口。顶端窗口有TOPMOST风格。

我们在点击使用不同窗口的同时,就在不断的改变Z序列。因为系统会将你点击的窗口(活动窗口)放在Z序列中同类窗口的顶部(顶层窗口)。当一个窗口成为了顶层窗口,它的子窗口也就成了顶层窗口。

最后,总结一下排序依次是:TOPMOST窗口—顶层窗口—非顶层窗口

SetWindowPos()函数:

BOOL SetWindowPos (
    HWND hWnd, //窗口句柄
    HWND hWndInsertAfter,  //原本可以是定位的窗口之前的窗口的句柄,但是主要使用的是一些参数。
    int X,
    int Y, //窗口左上角的x,y
    int cx,
    int cy, //窗口的宽度和高度
    UINT uFlags //窗口大小和位置标志,也是一些参数,具体参数比较多,详见MSDN。
);

主要解释第二个参数:hWndInsertAfter
请添加图片描述
上面截自MSDN,解释一下:

  • HWND_BOTTOM:将窗口置于Z顺序的底部。
  • HWND_NOTOPMOST:将窗口放置在所有非最上面的窗口上方(即,所有最上面的窗口的后面)。
  • HWND_TOP:将窗口置于Z顺序的顶部。
  • HWND_TOPMOST:将窗口置于所有最上面的窗口上方。即使禁用窗口,窗口也将保持其最高位置。

由上到下,越来越靠前,TOPMOST就是最上面的窗口。

Ps:发现了MSDN官网的解释存在的错误,HWND_TOPMOST 后面的Meaning第一句应该是:Places the window above all topmost windows. 太坑了。

MSDN地址:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos

猜你喜欢

转载自blog.csdn.net/qq_41214278/article/details/128160589
今日推荐