Bootstrap

Qt只保留边框,中间透明窗口

1、问题概述

  最近想用Qt做一个录制Gif的软件,但是一直想不通中间透明的窗口是怎么做的,就像Bandicam那样的(如图1-1所示)。
图 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的变透明

  这样做会把其他控件的黑色文字也变成透明的,我试过把背景设成蓝色,然后让蓝色便透明,可是鼠标却不能穿透了,就很奇怪。。。而且边框的颜色是系统控制的无法改变,总感觉边框的颜色有点不搭,改这个颜色又貌似有点麻烦,所以就这样吧。。。
在这里插入图片描述

;