知识大全 Visual C++设计超强仿QQ自动伸缩窗口[1]

Posted 边界

篇首语:知识的价值不在于占有,而在于使用。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Visual C++设计超强仿QQ自动伸缩窗口[1]相关的知识,希望对你有一定的参考价值。

Visual C++设计超强仿QQ自动伸缩窗口[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 观察

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

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

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

   窗口是个TopMost风格

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

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

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

   关于响应鼠标的进入与移出窗口 绝对不是WM_MOUSEMOVE WM_MOUSELEAVE 证明 你以及其慢的速度接触隐藏状态的QQ边界 你会发现几乎是 一触即发 你又以及其慢的速度移出显示状态的QQ 你会发现它的收缩反而不是 一触即发 的 而是离边缘 象素左右 而WM_MOUSEMOVE WM_MOUSELEAVE 只有在进入 移出Client区域才响应 明显和QQ不同 其实从第 点也可以知道

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

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

   粘附在两边的时候当你设置任务栏自动隐藏 QQ窗口会自动调整高度充满屏幕高度

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

   任务栏并不显示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;//是否设置了检测鼠标的TimerINTm_oldWndHeight;//旧的窗口宽度INTm_taskBarHeight;
  //任务栏高度INTm_edgeHeight;//边缘高度INTm_edgeWidth;//边缘宽度INTm_hideMode;//隐藏模式BOOL m_hsFinished;//隐藏或显示过程是否完成BOOL m_hiding;//该参数只有在!m_hsFinished才有效//真:正在隐藏  假:正在显示

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

WM_ NCHITTESM_MOVINGWM_CREATEWM_TIMER

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

//收缩模式#define HM_NONE //不收缩#define HM_TOP //向上收缩#define HM_BOTTOM //向下收缩#define HM_LEFT //向左收缩#define HM_RIGHT //向右收缩#define CM_ELAPSE    //检测鼠标是否离开窗口的时间间隔#define HS_ELAPSE //伸缩过程每步的时间间隔#define HS_STEPS  //伸缩过程分成多少步完成#define INTERVAL  //触发粘附时鼠标与屏幕边界的最小间隔 单位为象素#define INFALTE  //触发收缩时鼠标与窗口边界的最小间隔 单位为象素
cha138/Article/program/net/201311/15314

相关参考