• 10474阅读
  • 15回复

透明带阴影效果的窗体示例,支持Windows原生拖动和大小修改 [复制链接]

上一主题 下一主题
离线unizii
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2013-01-31
看到论坛上有朋友问如何实现窗体阴影效果,这个效果实现其实有很多方法可以实现,我总结了一下:
1.手动绘制一个透明的图片
这种方法非常简单,也是一些小软件常用的做法,只需用PS或AI画一个矩形加上混合效果然后用drawPixmap即可,但是这种方法并不支持窗体的缩放。。。。
2.使用算法,通过地址运算,实现一个矩形的模糊效果实现,CodeProject中有相关例子
3.使用九切片(Border Image),这是UI设计中常用的方法,对于一些形状规则,细节复杂的图片可以使用这种方法,例如Android的framework-res中就利用大量的九切片图片,这种方法代码编写起来比较麻烦但易于理解,可以重复利用,效率高。
4.重绘非客户区MFC中常用方法,我觉得挺恶心的,不说了。。。。

这里我使用九切片方法,用PS绘制了8个各方向的border和corner的png图片,然后拐角处直接绘制,边缘拉伸后绘制上去,可以得到很好的效果:

如图是我做的效果,左边的是airplay也运用了同样的方法。

接下来要解决的就是拖动等问题,我的解决方法并不是覆写mouseMoveEvent函数,这种方法可以实现拖动,但也可以将窗体拖出屏幕,不提倡。
我重写了winEvent函数,对WM_NCHITTEST进行处理,通过判断鼠标位置返回相应的操作标志,一并实现了拖放、改变大小、阻止拖出屏幕、Aero Shake。
由于没有了非客户区,QWidget也可以轻易跑到阴影上乘凉,这是这种方法的缺点,设置最小尺寸是个解决方法,但不是一劳永逸的方法,可以考虑将窗体内容放到一个Layout中,限制Layout大小为窗体空白区域的大小,可以实现限制QWidget脱离“客户区”。

上一个简单的源码(半个点做的,有些BUG,仅供参考)
DropShadowExample.rar (30 K) 下载次数:333
离线jdwx

只看该作者 1楼 发表于: 2013-01-31
其实这些不是问题,解决不了鼠标穿透,阴影是窗口的一部分,点击阴影会激活窗口。
而系统提供的阴影是点不中的,不会激活窗口。

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线unizii

只看该作者 2楼 发表于: 2013-01-31
我考虑过这个问题,不过用style的方法阴影不好看,系统提供有不知道怎么实现
离线shoelace
只看该作者 3楼 发表于: 2013-02-20
QGraphicsDropShadowEffect 不行吗?
离线nongxiaoming

只看该作者 4楼 发表于: 2013-02-21
真不错啊~~学习了~
离线jake19891110
只看该作者 5楼 发表于: 2013-02-26
真不错啊~~学习了~
离线zhuweilong

只看该作者 6楼 发表于: 2013-03-03
一定要好好学习,谢谢了
离线ppdayz

只看该作者 7楼 发表于: 2013-03-18
感谢楼主分享
离线rophie

只看该作者 8楼 发表于: 2013-03-20
顶一个
离线liudianwu

只看该作者 9楼 发表于: 2013-04-05
学习,顶
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线unizii

只看该作者 10楼 发表于: 2013-04-30
回 1楼(jdwx) 的帖子
现在有一种解决方案,我在WPF下实现的,用DropShadowEffect为一个Border添加阴影,然后通过HwndSource获取窗体句柄,SetWindowLong,用WS_EX_TRANSPARENT样式即可!!
离线jdwx

只看该作者 11楼 发表于: 2013-05-01
回 10楼(unizii) 的帖子
这个方案是不是和系统的一样,鼠标点不到阴影呢?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线笨笨小孩

只看该作者 12楼 发表于: 2013-05-11
不错,牛人啊!!!
你一定要努力哦!!!
离线neil-wen

只看该作者 13楼 发表于: 2013-08-15
不错  顶一下
离线liudianwu

只看该作者 14楼 发表于: 2014-01-07
根据作者的源码,已应用在商业项目中!
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线sqvipcom

只看该作者 15楼 发表于: 2014-03-31
确实不错
快速回复
限100 字节
 
上一个 下一个