近日做一VC客户端小程序时,由于对UI稍有要求,于是决定以图片为背景做一个不规则窗体。对过程中遇到的问题进行一个简单记录。
第一个版本的操作方式是,使用GDI绘图方式,制作了一个BMP的背景图和MASK图,顺利实现了不规则窗体。使用函数 SetLayeredWindowAttributes实现透明度,看起来也没问题。界面要大功告成的样子。结果发现在透明度低的时候,边缘的锯齿状 特别严重....这个显然就极不给力了,必须修改....
第一步认为是BMP蒙板图MASK边缘不够齐整,于是在画图工具和PS中折腾一阵,弄出一张边缘貌似更好一些的MASK蒙版图,替换后一试,果然没任何改善...仔细一想,确实也应该有锯齿,BMP蒙版方式对于背景图中的每个像素进行的是YES/NO选项,对每个像素来说要么留下要么去除,所以在弧形或者斜向的地方有锯齿是正常的,只是最初由于设置了透明度,不太显眼没看见而已。
那么用BMP蒙版方式实现背景图,边缘要实现比较好的抗锯齿,看起来比较艰难了。不过不死心是必然的,基本上要完工了,难道要现在完全重新来过。于是果断度娘,下载了不少关于VC实现不规则窗体的,结果发现用这种BMP蒙版抠图方式实现的不规则窗体,都是边缘有锯齿的。哎,没办法,重头再来。
第二遍为了防止悲剧重演,学乖了,去先搜集些资料再来做,结果发现,做的边缘效果好的,别人用的背景素材是有Alpha通道的png图像....重新打开PS,把背景图编辑成想要的不规则窗体(请注意,边缘羽化),