
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:《Qt 不规则窗体 – 无边框半透明》
其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿透。鼠标点击穿透被广泛应用在桌面挂件程序上,目的是为了避免鼠标对窗体进行误操作。
Qt 并没有自带的方法可以实现该功能,所以需要调用系统本身的 API 来实现。这里介绍下 Windows 下和 Linux 下如何实现鼠标点击穿透。
Windows API : SetWindowLong
SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
函数定义:
1 2 3 4 5 |
LONG WINAPI SetWindowLong( _In_ HWND hWnd, _In_ int nIndex, _In_ LONG dwNewLong ); |
头文件:
1 |
#include<Winuser.h> |
代码示例:
1 2 |
SetWindowLong((HWND)winId(), GWL_EXSTYLE, GetWindowLong((HWND)winId(), GWL_EXSTYLE) | WS_EX_TRANSPARENT | WS_EX_LAYERED); |
Linux X11 API : XShapeCombineRectangles
在 Linux/Unix 中,需要用到 X11 库函数:XShapeCombineRectangles。
函数定义:
1 2 3 4 5 6 7 8 9 10 |
void XShapeCombineRectangles ( Display *dpy, XID dest, int destKind, int xOff, int yOff, XRectangle *rects, int n_rects, int op, int ordering); |
头文件:
1 |
#include <X11/extensions/shape.h> |
代码示例:以 Linux 下 Qt 中使用为例
1 2 3 4 5 6 7 8 9 10 |
//头文件 #include <X11/extensions/shape.h> #include <QtX11Extras/QX11Info> //函数调用 XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput,0,0, NULL, 0, ShapeSet, YXBanded); //.pro文件中添加 QT += x11extras LIBS += -lX11 -lXext |
如无注明,均为原创。转载请注明: 转载自MITGAI`S THINKING
本文链接地址: Qt 不规则窗体 – 鼠标点击穿透
本文链接地址: Qt 不规则窗体 – 鼠标点击穿透
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果本文对您生活或工作产生了积极影响,那我非常高兴。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。