首页| 论坛| 消息

标题:透明带阴影效果的窗体示例,支持Windows原生拖动和大小修改
作者:unizii
日期:2013-01-31 21:41
内容:

看到论坛上有朋友问如何实现窗体阴影效果,这个效果实现其实有很多方法可以实现,我总结了一下:
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,仅供参考)


#1 [jdwx 01-31 22:30]
其实这些不是问题,解决不了鼠标穿透,阴影是窗口的一部分,点击阴影会激活窗口。
而系统提供的阴影是点不中的,不会激活窗口。
#2 [unizii 01-31 22:45]
我考虑过这个问题,不过用style的方法阴影不好看,系统提供有不知道怎么实现
#3 [shoelace 02-20 16:37]
QGraphicsDropShadowEffect 不行吗?
#4 [nongxiaoming 02-21 14:41]
真不错啊~~学习了~
#5 [jake19891110 02-26 17:01]
真不错啊~~学习了~

<< 1 2 3 >> (1/3)

回复 发表
主题 版块