Visual C 设计超强仿QQ自动伸缩窗口[1]

2008-02-23 05:41:02来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  一、观察

  模仿前最重要的一步就是观察,经过半天对QQ的摆弄和摸索,总结出了以下一些特点:

  1、窗口开始粘附时,检测的是鼠标坐标和桌面边界的距离,特别地,粘附在下面的时候,检测的是和任务栏的距离;

  2、在向上移动窗口时,窗口边界永远不会超出桌面上面边界;

  3、窗口是个TopMost风格;

  4、当窗口粘附在上面、左边或右边并显示时,您把鼠标移动到最顶端,光标变成改变窗口大小的图标,而单单是把窗口的top坐标配置为0是不行的;

  5、粘附在下面的时候,当处于移动状态,那么窗口的底边是和任务栏顶边对齐的,但从隐藏到显示的时候,窗口的底端是和屏幕底边对齐的;

  6、隐藏后显露出来的那条线可能是个Border,但肯定的是绝不包含Client区域;

  7、关于响应鼠标的进入和移出窗口,绝对不是WM_MOUSEMOVE、WM_MOUSELEAVE。证实:您连同其慢的速度接触隐藏状态的QQ边界,您会发现几乎是“一触即发”,您又连同其慢的速度移出显示状态的QQ,您会发现他的收缩反而不是“一触即发”的,而是离边缘10象素左右。而WM_MOUSEMOVE,WM_MOUSELEAVE,只有在进入、移出Client区域才响应,明显和QQ不同,其实从第6点也能够知道;

  8、粘附在两边的时候,高度会调整为桌面上边界到任务栏下边界的距离;

  9、在“拖动时显示窗口内容”模式下(桌面属性-外观-效果),粘附在两边的拖动出来时;假如收缩之前高度比收缩后小则回复原来高度,在非“拖动时显示窗口内容”模式下,光栅会回复原来高度,但释放左键时,高度却是收缩时调整后的高度,一开始我以为这是个BUG,但我编写时同样出现这个问题,发现这两种模式会影响WM_MOVING参数的意义;

  10、粘附在两边的时候当您配置任务栏自动隐藏,QQ窗口会自动调整高度充满屏幕高度;

  11、窗口显示或隐藏不是一瞬间的,这点在第9点提到的两种模式下,会有所不同;

  12、任务栏并不显示QQ窗口;

  二、编写代码

  观察完毕,就开始编写了。

  首先新建一个基于对话框的MFC程式,命名为QQHideWnd,在对话框属性的styles页把border改为Resizing,您也可同时把Entended styles 的 tool window 钩上,对于这点我在程式了动态修改了。

  在QQHideWndDlg.h头文档添加以下成员函数:

  protected:

//修正移动时窗口的大小
void FixMoving(UINT fwSide, LPRECT pRect);
//从收缩状态显示窗口
void DoShow();
//从显示状态收缩窗口
void DoHide();
//重载函数,只是为了方便调用,实际调用CWnd的SetWindowPos(…)
BOOL SetWindowPos(const CWnd* pWndInsertAfter,LPCRECT pCRect,
  UINT nFlags = SWP_SHOWWINDOW);

  继续添加成员变量:

private::BOOL m_isSizeChanged;//窗口大小是否改变了
BOOL m_isSetTimer;//是否配置了检测鼠标的Timer
INTm_oldWndHeight;//旧的窗口宽度INTm_taskBarHeight;
  //任务栏高度INTm_edgeHeight;//边缘高度
INTm_edgeWidth;//边缘宽度
INTm_hideMode;//隐藏模式
BOOL m_hsFinished;//隐藏或显示过程是否完成
BOOL m_hiding;//该参数只有在!m_hsFinished才有效
//真:正在隐藏,假:正在显示

  增加消息响应,需要注意的是有些消息您只有把右下角的 Filter for message配置为window才能看到。

WM_ NCHITTEST
WM_MOVING
WM_CREATE
WM_TIMER

  然后来到对应的cpp文档,在头部定义一些宏:

//收缩模式#define HM_NONE0//不收缩
#define HM_TOP1//向上收缩
#define HM_BOTTOM2//向下收缩
#define HM_LEFT3//向左收缩
#define HM_RIGHT4//向右收缩
#define CM_ELAPSE200 //检测鼠标是否离开窗口的时间间隔
#define HS_ELAPSE5//伸缩过程每步的时间间隔
#define HS_STEPS10//伸缩过程分成多少步完成
#define INTERVAL20//触发粘附时鼠标和屏幕边界的最小间隔,单位为象素
#define INFALTE10//触发收缩时鼠标和窗口边界的最小间隔,单位为象素

[1] [2] [3] [4]




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 分部方法:应该纳入到C#中吗?

下一篇: Visual C 设计超强仿QQ自动伸缩窗口[4]

热门词条
热门标签