查看完整版本: [-- 无边框窗体实现 --]

QTCN开发网 -> Qt代码秀 -> 无边框窗体实现 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

lemonzll 2018-08-17 11:33

无边框窗体实现

自己最近在使用的无边框窗体实现方式,通过重载nativeEvent实现,只适用于windows。支持Aero Snap。
[attachment=19354]

更新了下之前的程序,添加了无边框对话框的实现。
[attachment=19947]

微软有篇文章,大概说明了下怎么使用DWM功能实现自定义标题栏,跟上面的方式稍有不同,最小化,最大化和关闭按钮可以保留,网址是https://docs.microsoft.com/en-us/windows/desktop/dwm/customframe。大概照着写了个例子,还没完善,以后再更新。
[attachment=19948]
[attachment=19949]

笑颜 2018-08-17 21:47
非常强大,我一直想找去掉系统边框,但是不去掉系统边框带来的特性的方法,终于被我逮到了,万分感谢

z609932088 2018-08-19 10:53
感谢,这个真是一个好东西

dxa572862121 2018-09-13 10:34
自己也重写了一个无边框的,但是效果不是很好

dannys 2018-09-30 16:20
问下楼主我QT5.10.1运行你的例子报错,这个是什么问题

error: 'SM_CXPADDEDBORDER' was not declared in this scope, 有加头文件windows.h,
                ^


沉默小ai 2018-10-10 14:20
感谢楼主了,下载学习去了

duqingnian 2018-10-31 20:03
C:\Users\duqingnian\Downloads\SimpleDemo\frameless\framelesswidget.h:35: error: 'unique_ptr' in namespace 'std' does not name a template type
     const std::unique_ptr<FramelessWidgetPrivate> d;
                ^

圣域天子 2018-10-31 20:41
我原先也是这么用的,但是它与win一套任务栏菜单加图标的库产生冲突,所以现在不用它了。
不知道最新版本的Qt是否还有冲突

yuyu414 2018-11-01 11:19
圣域天子:我原先也是这么用的,但是它与win一套任务栏菜单加图标的库产生冲突,所以现在不用它了。
不知道最新版本的Qt是否还有冲突 (2018-10-31 20:41) 

和opengl也有冲突

圣域天子 2018-11-02 20:32
yuyu414:和opengl也有冲突 (2018-11-01 11:19) 

如果仅仅是窗口影阴,可以用css实现,还兼容不同OS,是个更好日选择。

lemonzll 2018-11-04 08:59
是跟opengl有冲突,有opengl的我都做的有边框。无边框这个也是看情况,做固定大小的窗口或者不要aero snap的都是直接用处理mouseevent搞定

yuyu414 2018-11-08 13:37
圣域天子:如果仅仅是窗口影阴,可以用css实现,还兼容不同OS,是个更好日选择。 (2018-11-02 20:32) 

主要是为了aero snap,仅仅是阴影的话很多种方法都可以,反正我是放弃了aero snap,缩放移动全部用qt本身的库实现,也好跨平台

14730629 2018-12-09 22:42
你好!在linux下使用Qt::FramelessWindowHint实现的无边框窗口,窗口无法移出屏幕外,请问有什么办法

ngugc 2019-04-25 08:22
谢谢!
发现一个问题,拉动上边沿的时候下边沿会跟着抖动,拉动左边沿的时候右边沿会跟着抖动。
像notepad,拉动上边沿或左边沿,窗口其他部分是不动的。
不知道有没有办法解决这个问题?

lemonzll 2019-04-27 11:15
ngugc:谢谢!
发现一个问题,拉动上边沿的时候下边沿会跟着抖动,拉动左边沿的时候右边沿会跟着抖动。
像notepad,拉动上边沿或左边沿,窗口其他部分是不动的。
不知道有没有办法解决这个问题? (2019-04-25 08:22) 

这个我还真不知道怎么解决了。那是拉动的时候layout要重新布局,paintEvent也会调用,会稍微迟钝下。如果要解决,就不能用这种方法了,要纯用Qt实现,就是拖动的时候显示一个虚线框,释放的时候才会放大缩小窗口,就是这种又不支持Aero Snap了。现在用的重载nativeEvent的方法主要就是为了支持Aero Snap,不要这个效果的话很多其他方法可以用。

lemonzll 2019-04-27 11:19
dannys:问下楼主我QT5.10.1运行你的例子报错,这个是什么问题
error: 'SM_CXPADDEDBORDER' was not declared in this scope, 有加头文件windows.h,
                ^
....... (2018-09-30 16:20) 

你应该是用的mingw编译器吧?mingw要在pro文件里加DEFINES += _WIN32_WINNT=0x0601和DEFINES += WINVER=0x0601应该才行

ngugc 2019-04-28 09:07
lemonzll:这个我还真不知道怎么解决了。那是拉动的时候layout要重新布局,paintEvent也会调用,会稍微迟钝下。如果要解决,就不能用这种方法了,要纯用Qt实现,就是拖动的时候显示一个虚线框,释放的时候才会放大缩小窗口,就是这种又不支持Aero Snap了。现在用的重载nativeEvent的方法主 .. (2019-04-27 11:15) 

谢谢!这个问题看来没有完美的解决办法。
昨天我在xp上测试,发现程序刚启动的时候,任务栏的图标不是active状态,因为代码中屏蔽了WM_NCACTIVATE消息。

zxjrainbow 2019-07-10 11:23
  


查看完整版本: [-- 无边框窗体实现 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled