VC超强仿QQ自动伸缩窗口

摘要:

某天在CSDN论坛上看到有人发帖询问QQ自动伸缩窗口是怎么实现的,我也好想知道,于是到百度一搜索,结果不多,来来去去都是那几篇,下载那些demo运行一下,发觉效果与QQ相差很大,于是决定自己动手做个,要求要近乎完美地模仿这个功能。由于是些效果的东西,贴图也看不出来,所以文章里就不截图了,想看效果的就直接运行源代码的demo吧。

一、观察

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

时间: 2024-10-23 00:54:55

VC超强仿QQ自动伸缩窗口的相关文章

仿QQ面板举一反三之拉幕式窗口

设计昨天尝试了仿QQ面板的设计(具体请看:http://www.cnblogs.com/KenBlove/archive/2008/09/27/1300938.html),今天忽然想如果将面板横着放,不就成了一个拉幕式的窗口了么? 说做就做.立即动手: 首先,和QQ面板不同的就是QQ面板设计当点击Module button的时候,会显示下一级的button.但是这次我们做的不同,应该显示不同的内容,道理大同小异.我们将在panel中加入usercontrol,至于usercontrol里面要显示

咋办QQ自动贴边隐藏和Win7窗口自动最大化冲突

Windows7 为了改善用户操作体验,强化了鼠标窗口拖拽操作的功能.如果我们用鼠标将某程序窗口拖拽至桌面左侧或右侧,这个程序窗口就会自动以 50% 的宽度在桌面左侧或右侧显示,方便横向比对;如果将程序窗口拖拽至桌面顶部,则可以实现窗口的自动最大化,再次拖拽又会恢复原始窗口大小,这类似于早期版本Windows 的鼠标双击窗口标题栏. 在微软新闻组看到一个问题:QQ 是大家非常熟悉的常用即时通讯软件,其主面板采用了类似 Windows 侧边栏的设计,因此很多人习惯设置 QQ 主面板的自动隐藏,使桌

jQuery仿QQ空间图片查看特效(全屏,放大,缩小,旋转,镜像,鼠标滚轮缩放)

地址:http://www.tuicool.com/articles/2YRVr2a 可以通过nmp或bower来安装该图片查看器插件. npm install imageviewer bower install imageviewer 复制代码 使用方法 使用该幻灯片插件需要引入jQuery,viewer.css和viewer.js文件. <link rel="stylesheet" href="css/viewer.css" type="text

完美实现仿QQ空间评论回复特效

  这篇文章主要介绍了完美实现仿QQ空间评论回复特效,非常的实用,附上实例代码给大家,有需要的小伙伴参考下吧. 评论回复是个很常见的东西,但是各大网站实现的方式却不尽相同.大体上有两种方式 1. 像优酷这种最常见,在输入框中@要回复的人,这种方式下,用户可以修改@. 新浪微博则是在这个基础上,弹出好友菜单.这种方式的好处是不需要任何js,css处理兼容. 2. 像qq空间这种,对回复的人整个删除.本屌感觉这种方式比较好,但这种方式有些兼容性上的细节,这个后面会详细说明. 事实上,qq空间的这种实

jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果

jquery图片特效制作仿腾讯QQ商城首页banner焦点图片轮播切换效果,带索引按钮控制和左右按钮控制图片切换,实例代码如下,感兴趣的朋友可以参考下哈   复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jquery图片

用VBScript制作QQ自动登录的脚本代码

有时候我们在个人电脑上,每次输入密码比较麻烦,可以自动登录,但如果qq账号多了,就可以使用这个脚本了   一直用的是狂人版的QQ,也用它附赠的自动登录器很久了,不过最近一版的狂人QQ不知为何取消了自动登录组件.好在QQ2009已经能够同时记住多个号码的密码,虽然要多点击几下,但依然能够实现免输入密码登录. 谁知最近不知道电脑发了什么疯,每隔一段时间,QQ记住的密码就会被清空.我的两个QQ号密码都设置得比较复杂,每次登录要输入两遍密码实在是件痛苦的事情,于是决定自制一个登录器. 在网上找了许久,发

Android自定义ListView实现仿QQ可拖拽列表功能_Android

我们大致的思路,其实是这样子的,也是我的设想,我们可以先去实现一个简单的ListView的数据,但是他的Adapter,我们可以用系统封装好的,然后传递进去一个实体类,最后自定义一个listview去操作,所以我们先把准备的工作做好,比如? list_item.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.a

将不定期开放“人人都说Swing丑,唯我独爱它—Swing高仿QQ” 源码

问题描述 从今天开始将会在CSDN上开放Swing高仿QQ的源码.所有信息第一时间在群里公布一起探讨java方面的问题.本群位置有限先来先得所以加群时请注名信息来源地packageclient.login;importjava.awt.EventQueue;importjava.awt.Image;importjava.awt.SplashScreen;importjava.awt.Window;importjava.awt.event.ActionEvent;importjava.awt.ev

基于jQuery实现仿QQ空间送礼物功能代码_jquery

我们在QQ空间里面有一个送礼物的功能,显示了最近过生日的人.我们只要把鼠标放到如下图的生日快乐那标签上,就会显示可以给该人送的礼物!! 如下图所示: 单击其中的一个礼物,就会马上送出去.但是我们现在是要说的还有单击更多的时候,会另外弹出一个新的窗口在当前页面最前面!如下图显示: 怎么实现那上面的功能呢? 就是把鼠标放上去,弹出一天tips,单击tips里面的控件,之后弹出另外一个弹出框. 网上就会有很多比较好的插件,就先到网上去找了相对应的jquery插件. jquery中tips的有很多插件,