忙和了很久,学到很多东西,2007过得还算充实,2008不知道是否可以逃过劫难,常常做恶梦,希望2008快快过去半年,哪时候是好是坏都有了结果。在2007年上半年,曾经看到过Yahoo的新版本Messager的界面,非常的个性化,这类异形窗口效果是传统窗口所无法实现的。而异形窗口的实现一般有两种方法:1、通过SetWindowRgn 2、UpdateLayeredWindow。第一种方法很通用,但是做出的效果不是非常绚丽,由于计算机表达Rgn的局限,做出的界面时常有毛刺而影响视觉效果。UpdateLayeredWindow只实用于32位带alpha通道的图片,由于Windows直接拿图片与桌面进行叠加透明处理,所以窗口边缘的毛刺一般可通过阴影消除掉。使用UpdateLayeredWindow后的窗口将不在响应WM_PAINT消息,这是一个非常棘手的问题,解决办法是创建一个顶层窗口用来承载子界面,将Layered窗口置于其下并控制其位置。加之之前的界面库,引入具有这样特性的一类窗口也不是难事。
当然我的实现思想也是采取UpdateLayeredWindow:首先创建一个32位的和窗口大小一致的位图,然后贴png图片,绘制窗口界面元素,最后进行窗口层更新,这样就有了无窗口的一套界面解决方案。但是有时候,由于各种原因是需要常规Window的,所以还得把常规的窗口界面纳入进来。
有了思路就开始动手改造,下载其他的软件研究,上网学习一些相关技术。用了两天,基本移植进来,此次用了GDIPlus,也不管tmd跨不跨平台了。界面描述:
下面是截图:
至于所谓的磨砂效果,其实就是blur模糊。由于UpdateLayerWindow只允许你提供一个自己的位图,之后会自动为你进行图片合成,合成方法无法参与,故想实现blur恐怕要大废一番力气,很可能要抛弃这套流出而模拟出一套。下一步工作就是创建一个顶层窗口,跟随这个漂亮的外壳移动了。之前的界面描述机制也自然可以进来了。