日历软件的界面实现
今天看了一下两个日历软件的界面实现,一个是老外的ADC,还有个是国产的鱼鱼桌面日历秀,它们都有一个特点是,能把日历显示在桌面最底层,就算你用鼠标在上面点,划,都是相当于直接点在桌面上,但是视觉效果上,它们又是确实存在的。
大概看了一下,ADC的实现比较简单,就是把Wallpaper截下来,然后把自己的日历内容,Todo list 都画到上面去,生成一个新的bmp 文件,然后,“啪”一下,在后面偷偷把Wallpaper 换成那张bmp。如果本来没有Wallpaper的,就直接把底层颜色截下来再画,就是这样。另外再添加个鼠标钩子,估计用线程钩子就够用了,钩住Explorer.exe 上的双击事件,判断一下鼠标的坐标,在那个日历的区域内,就做出相应的反应,比如弹出个对话框之类的。另外有一点,是要截获桌面主题修改的事件(或消息),免得那张bmp 的内容没有跟着换,用户就不干了。还有就是,在桌面边缘它会添加一个任务栏,是看起来半透明的样子,粗略地观察了一下,是这样处理的:某点像素值有RGB三部分,每部分分别加上一个值成为一个新的值,至于加多少,如果是00,则加0x4D,如果是80,则加0x26,如果是FF,则不加,估计是这样的均匀分布,最后造成一种半透明的视觉效果。总之,给人有点骗人的感觉,但是,它实现方法比较简单,普通用户谁去管它是怎么做的,看起来做到这个外观样子了就行了。
鱼鱼的我就比较晕了,只是才翻了MSDN 发现的,设置几个窗口的扩展属性可以实现鼠标穿透,加上WS_EX_LAYERED 和 WS_EX_TRANSPARENT 就可以,再调用一下SetLayeredWindowAttributes 设置一下透明度,就可以了,把窗口设成一开始就不激活,把任务栏上的按钮隐藏,就基本达到要求了。它的半透明效果基本上是用图片实现的,用了换肤的技术,把PNG 图片用GDI+ 画上去,PNG 可以有透明,并且色彩数比GIF 多,GDI+ 可以处理PNG。不过,它还有点牛的地方是,如果设成普通的鼠标不穿透的,它居然也能把窗口停在最底下,不知道这点是怎么实现了,观察了半天的它的消息和窗口风格设置,都没看出个所以然了。但是我想,这样的功能,应该网上已经有很多讨论和代码了吧。