stdware / qwindowkit

Cross-platform frameless window framework for Qt. Support Windows, macOS, Linux.
Apache License 2.0
573 stars 90 forks source link

Windows 10下使用DWM Blur效果边缘会出现模糊,顶部出现多余横线 #132

Open mentalfl0w opened 1 month ago

mentalfl0w commented 1 month ago

复现流程:直接编译仓库,使用示例程序,在Windows 10下使用DWM Blur效果,窗口边缘会出现多余模糊(这部分本该是窗口阴影),顶部出现多余横线(约1px,系统日间模式为纯白,夜间模式为纯黑)。 图片:

image image
SineStriker commented 1 month ago

为啥我的win10上没复现

mentalfl0w commented 1 month ago

我用的是Qt 6.6.3,MinGW编译的,测试程序用的是QtWidget的例子,我刚测试了一下QtQuick的也有这个问题,边缘的空隙在系统处于深色模式的时候更加明显。 image

SineStriker commented 1 month ago

我是qt6.6.1,我有空试试你的版本

SineStriker commented 1 month ago

我用的是Qt 6.6.3,MinGW编译的,测试程序用的是QtWidget的例子,我刚测试了一下QtQuick的也有这个问题,边缘的空隙在系统处于深色模式的时候更加明显。 image

我用了 Qt 6.6.3 MinGW 11.2 编译,依旧没有复现这个问题。请问你用的 Windows 10 的版本是多少,Windows SDK 的版本是多少。

mentalfl0w commented 1 month ago

我用的是Windows 10 on Arm64,版本号是21390.1,因为是mingw编译就没有安装Windows SDK,之前反馈的用户用的是Windows 10 22H2(19045.4842),Qt 6.5.1, msvc,也同样出现了这个问题。

SineStriker commented 1 month ago

我用的是Windows 10 on Arm64,版本号是21390.1,因为是mingw编译就没有安装Windows SDK,之前反馈的用户用的是Windows 10 22H2(19045.4842),Qt 6.5.1, msvc,也同样出现了这个问题。

我是 Windows 10 22H2(19045.4780)。。。暂时测不了

mentalfl0w commented 1 month ago

嗯嗯,或许可以看看别的用户是否也有相关问题。主要是我的设备不是Mac就是Windows 11,实在找不到Windows 10的设备了,有用户反馈我才做的测试,发现也出现了相应问题。

wangwenx190 commented 1 month ago

dwm blur 是有这个问题。这个效果是用私有API强行开出来的,如果你想要传统的模糊效果(非亚克力、非云母),可以自己用DwmEnableBlurBehindWindow搭配透明的窗口背景来实现。

SineStriker commented 1 month ago

我用的是Windows 10 on Arm64,版本号是21390.1,因为是mingw编译就没有安装Windows SDK,之前反馈的用户用的是Windows 10 22H2(19045.4842),Qt 6.5.1, msvc,也同样出现了这个问题。

你可以试试把src/widgets/widgetwindowagent_win.cppsetupWindows10BorderWorkaround的实现全部注释掉,再看看问题会不会复现。这个函数是为了解决windows10开启无标题栏以后系统上边框消失的问题的,具体做法就是窗口重绘时在最顶上画一条黑线(反正微软就是这么做的,这个参考了 Windows Terminal 的代码)。有可能是开启blur以后与这个workaround产生冲突了。

mentalfl0w commented 1 month ago

我用的是Windows 10 on Arm64,版本号是21390.1,因为是mingw编译就没有安装Windows SDK,之前反馈的用户用的是Windows 10 22H2(19045.4842),Qt 6.5.1, msvc,也同样出现了这个问题。

你可以试试把src/widgets/widgetwindowagent_win.cppsetupWindows10BorderWorkaround的实现全部注释掉,再看看问题会不会复现。这个函数是为了解决windows10开启无标题栏以后系统上边框消失的问题的,具体做法就是窗口重绘时在最顶上画一条黑线(反正微软就是这么做的,这个参考了 Windows Terminal 的代码)。有可能是开启blur以后与这个workaround产生冲突了。

顶上多余的白线解决了,模糊化的问题仍然存在。 image

SineStriker commented 1 month ago

我用的是Windows 10 on Arm64,版本号是21390.1,因为是mingw编译就没有安装Windows SDK,之前反馈的用户用的是Windows 10 22H2(19045.4842),Qt 6.5.1, msvc,也同样出现了这个问题。

你可以试试把src/widgets/widgetwindowagent_win.cppsetupWindows10BorderWorkaround的实现全部注释掉,再看看问题会不会复现。这个函数是为了解决windows10开启无标题栏以后系统上边框消失的问题的,具体做法就是窗口重绘时在最顶上画一条黑线(反正微软就是这么做的,这个参考了 Windows Terminal 的代码)。有可能是开启blur以后与这个workaround产生冲突了。

顶上多余的白线解决了,模糊化的问题仍然存在。 image

那可能就是blur水土不服了,本来就是逆向来的。

SineStriker commented 1 month ago

或者,你可以在win10上关掉编译选项QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS,这样整个系统边框都会被隐藏,可能就没这个问题了。

mentalfl0w commented 1 month ago

我用的是Windows 10 on Arm64,版本号是21390.1,因为是mingw编译就没有安装Windows SDK,之前反馈的用户用的是Windows 10 22H2(19045.4842),Qt 6.5.1, msvc,也同样出现了这个问题。

你可以试试把src/widgets/widgetwindowagent_win.cppsetupWindows10BorderWorkaround的实现全部注释掉,再看看问题会不会复现。这个函数是为了解决windows10开启无标题栏以后系统上边框消失的问题的,具体做法就是窗口重绘时在最顶上画一条黑线(反正微软就是这么做的,这个参考了 Windows Terminal 的代码)。有可能是开启blur以后与这个workaround产生冲突了。

顶上多余的白线解决了,模糊化的问题仍然存在。 image

那可能就是blur水土不服了,本来就是逆向来的。

是的,其他几个效果(Acrylic,mica,mica-alt)在Windows 10下也不能开启,我索性就让Windows 10下都不开启模糊化效果了。Windows 10明年支持就到期了,现在再往里面投入应该收益不大,Windows 11下没问题就OK,不过Windows 11下的Acrylic和Mica之类的效果都有各种各样的问题,只有DWM是正常的,不过有一个可以用就行了。

dwm blur 是有这个问题。这个效果是用私有API强行开出来的,如果你想要传统的模糊效果(非亚克力、非云母),可以自己用DwmEnableBlurBehindWindow搭配透明的窗口背景来实现。

其余的可以自己加蒙版自定义。

或者,你可以在win10上关掉编译选项QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS,这样整个系统边框都会被隐藏,可能就没这个问题了。

image 关闭后这个边缘模糊的问题解决了,😂新的问题又出现了,Windows的原始边框出来了

SineStriker commented 1 month ago

很烦。那win10上还是不要用了吧。。。我看你的仓库里还有一个 win10 边框的 issue,那个方便的话也开个issue吧。这个 issue 留着不关。

mentalfl0w commented 1 month ago

很烦。那win10上还是不要用了吧。。。我看你的仓库里还有一个 win10 边框的 issue,那个方便的话也开个issue吧。这个 issue 留着不关。

OK,#134 已经开好了