类似QQ贴边掩藏功能的实现(三)

        大体功能基本实现了,但还需要结合我们产品的特性去考虑一些细节问题,并进行充分的测试。下面将列出在开发过程中遇到的一些主要的细节和问题。

        1、WM_MOVING问题

        在测试向左和向右的贴边掩藏时,发现一个奇怪的问题:在我的机器上运行没问题,在别人的机器上却有问题。具体表现为:当拖动窗口向左或右贴边掩藏时,在触发掩藏的那一刻,从高度方向看,只看到一个充满整个桌面客户区的虚线框,窗口并没有充满整个桌面客户区。此时,对比了QQ和飞信,QQ是没问题的,飞信却存在类似的问题。后来到百度上搜了一下,找到一篇相关的文章,提到这与系统属性的设置有关。在我的电脑 -> 属性 -> 高级 -> 视觉效果页面中勾选“拖动窗口时显示内容”选项,就可以了。于是试了一下,确实可以达到预想的效果了。但这并没有从根本上解决问题,总不能让用户去手动修改这样的系统设置吧;难道需要我们通过代码去设置系统的这个属性?最终还是找到了原因,这与窗口的移动机制有关。在窗口的移动过程激发了无数个WM_MOVING消息,通常情况下,发生MOVING的时候正是上面所说拖动虚框的时候,这时窗口并未真正的移动,真正的移动只有一次,那就是最终的那个WM_MOVE激发的时刻。了解了上述过程,我们可以在发生WM_MOVING的时候就移动窗口,所以在上面的FixMoving函数中加上了MoveWindow函数。这样,问题就解决了。

        2、窗口的掩藏与展开的抽屉般的动画效果

        要实现所谓的抽屉般的动画效果,其实就是分若干步将窗口移动到目标位置,这需要通过定时器来控制。但是发现在分步的情况下窗口会有一定的闪烁的问题,于是对比了新版的QQ2011,QQ已经取消了这样的动画效果,而是一次性移到位的。再就是定时器消息多了也会增加程序的消息处理负担,所以我们也索性模仿QQ2011的做法,一次性移动窗口,这样就规避了上述问题。

        3、窗口类的封装

       考虑到代码的可重用性,对代码做了一个封装,封装后就便于继承了。要实现这样的贴边掩藏功能,继承一下就可以了。

       当我们在开发新功能或解决新问题的时候,网上可参考的代码是很多的,但在实际使用时在细节上可能或多或少的存在一些问题,要用到我们开发的产品中,还需要很多工作要做,有很多东西需要细化和处理。这就要求我们能够在原有代码的基础上,按照我们自己的需求对代码进行整理和改进。

你可能感兴趣的:(类似QQ贴边掩藏功能的实现(三))