手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  一、观察

  模仿前最重要的一步就是观察,经过半天对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]




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS