• 3785阅读
  • 17回复

无边框窗体实现 [复制链接]

上一主题 下一主题
离线lemonzll
 

只看楼主 倒序阅读 楼主  发表于: 2018-08-17
自己最近在使用的无边框窗体实现方式,通过重载nativeEvent实现,只适用于windows。支持Aero Snap。
SimpleDemo.zip (191 K) 下载次数:376

更新了下之前的程序,添加了无边框对话框的实现。
SimpleDemo_v1.zip (196 K) 下载次数:35

微软有篇文章,大概说明了下怎么使用DWM功能实现自定义标题栏,跟上面的方式稍有不同,最小化,最大化和关闭按钮可以保留,网址是https://docs.microsoft.com/en-us/windows/desktop/dwm/customframe。大概照着写了个例子,还没完善,以后再更新。
dwmtest.zip (6 K) 下载次数:25
window.open('http://www.qtcn.org/bbs/attachment/Mon_1903/92_159353_5008448e23f3153.png?3');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >
离线笑颜

只看该作者 1楼 发表于: 2018-08-17
非常强大,我一直想找去掉系统边框,但是不去掉系统边框带来的特性的方法,终于被我逮到了,万分感谢
离线z609932088

只看该作者 2楼 发表于: 2018-08-19
感谢,这个真是一个好东西
有阳光的地方就是青春
离线dxa572862121

只看该作者 3楼 发表于: 2018-09-13
自己也重写了一个无边框的,但是效果不是很好
离线dannys

只看该作者 4楼 发表于: 2018-09-30
问下楼主我QT5.10.1运行你的例子报错,这个是什么问题

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

离线沉默小ai

只看该作者 5楼 发表于: 2018-10-10
感谢楼主了,下载学习去了
离线duqingnian

只看该作者 6楼 发表于: 2018-10-31
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;
                ^
离线圣域天子

只看该作者 7楼 发表于: 2018-10-31
我原先也是这么用的,但是它与win一套任务栏菜单加图标的库产生冲突,所以现在不用它了。
不知道最新版本的Qt是否还有冲突
离线yuyu414

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

和opengl也有冲突
离线圣域天子

只看该作者 9楼 发表于: 2018-11-02
回 yuyu414 的帖子
yuyu414:和opengl也有冲突 (2018-11-01 11:19) 

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

只看该作者 10楼 发表于: 2018-11-04
是跟opengl有冲突,有opengl的我都做的有边框。无边框这个也是看情况,做固定大小的窗口或者不要aero snap的都是直接用处理mouseevent搞定
离线yuyu414

只看该作者 11楼 发表于: 2018-11-08
回 圣域天子 的帖子
圣域天子:如果仅仅是窗口影阴,可以用css实现,还兼容不同OS,是个更好日选择。 (2018-11-02 20:32) 

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

只看该作者 12楼 发表于: 2018-12-09
你好!在linux下使用Qt::FramelessWindowHint实现的无边框窗口,窗口无法移出屏幕外,请问有什么办法
离线ngugc

只看该作者 13楼 发表于: 04-25
谢谢!
发现一个问题,拉动上边沿的时候下边沿会跟着抖动,拉动左边沿的时候右边沿会跟着抖动。
像notepad,拉动上边沿或左边沿,窗口其他部分是不动的。
不知道有没有办法解决这个问题?
离线lemonzll

只看该作者 14楼 发表于: 04-27
回 ngugc 的帖子
ngugc:谢谢!
发现一个问题,拉动上边沿的时候下边沿会跟着抖动,拉动左边沿的时候右边沿会跟着抖动。
像notepad,拉动上边沿或左边沿,窗口其他部分是不动的。
不知道有没有办法解决这个问题? (2019-04-25 08:22) 

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

只看该作者 15楼 发表于: 04-27
回 dannys 的帖子
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

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

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

只看该作者 17楼 发表于: 07-10
  
快速回复
限100 字节
 
上一个 下一个