1、问题概述
最近想用Qt做一个录制Gif的软件,但是一直想不通中间透明的窗口是怎么做的,就像Bandicam那样的(如图1-1所示)。
网上有人说使用无边框窗口,然后自己画出边框,可是后边怎么实现边框的放大缩小我一直没找到好的办法,Qt实现屏幕GIF录制工具(源码)这个里面作者是建立了上下两个窗口,把中间空出来,然后利用QPainter画一个方框给包起来实现的。拖动放大是通过设置setSizeGripEnabled(true)// 在右下角显示三角抓痕,方便拖动属性实现的,重写resizeEvent事件获取窗口大小变化信号。这样做无法实现左右边框的自由拖动,而且要让两个窗口同步也需要写很多东西,感觉有点麻烦。
后来我在这种挖空中心的窗体是怎么做的?“Max Xing”大佬的回答中找到了新方法,利用winAPI函数
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
hwnd是透明窗体的句柄,
crKey为颜色值,
bAlpha是透明度,取值范围是[0,255],
dwFlags是透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
摘自WinAPI透明窗体SetLayeredWindowAttributes(转载)
2、代码
先把窗口背景色设置成黑色:
setStyleSheet(QString::fromUtf8("background-color: rgb(0, 0, 0);"));
在通过设置SetLayeredWindowAttributes属性将黑色的地方变透明
HWND hd = (HWND)regWidget->winId();
SetWindowLong(hd, GWL_EXSTYLE, GetWindowLong(hd, GWL_EXSTYLE) ^ WS_EX_LAYERED);
SetLayeredWindowAttributes(hd, RGB(0, 0, 0), 255, LWA_COLORKEY); // 设置颜色为0的变透明
这样做会把其他控件的黑色文字也变成透明的,我试过把背景设成蓝色,然后让蓝色便透明,可是鼠标却不能穿透了,就很奇怪。。。而且边框的颜色是系统控制的无法改变,总感觉边框的颜色有点不搭,改这个颜色又貌似有点麻烦,所以就这样吧。。。