知识大全 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

相关参考

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

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

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

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

知识大全 用Visual C++实现带阴影弹出窗口的技术

用VisualC++实现带阴影弹出窗口的技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.

知识大全 QQ尾巴病毒的Visual C++实现探讨

QQ尾巴病毒的VisualC++实现探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 基于Visual C++ 的自动化客户端的实现

基于VisualC++的自动化客户端的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一概述

知识大全 为什么我QQ发完信息窗口会自动关闭 在哪模式里看不到原先有的那个发送完消息关闭窗口的设置了怎么办

为什么我QQ发完信息窗口会自动关闭在哪模式里看不到原先有的那个发送完消息关闭窗口的设置了怎么办?  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整

知识大全 小米手机qq消息来的时候不会自动弹出窗口,也不会指示灯提醒 不然就是过很久才会提醒

小米手机qq消息来的时候不会自动弹出窗口,也不会指示灯提醒不然就是过很久才会提醒这个一般都是设置消息通知的问题,具体的处理方法如下:1、打开手机,然后进入手机的设置。2、然后选择里面的通知和状态栏。3

知识大全 我的Visual C++入门之路

我的VisualC++入门之路  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!N次失败次成功还学的不

知识大全 Visual C++中OpenGL编程入门

VisualC++中OpenGL编程入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Open

知识大全 Visual C++制作一个Sniffer实例

VisualC++制作一个Sniffer实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Snif