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