一 观察
模仿前最重要的一步就是观察 经过半天对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 fwSideLPRECT pRect)//从收缩状态显示窗口void DoShow()//从显示状态收缩窗口void DoHide()//重载函数 只是为了方便调用 实际调用CWnd的SetWindowPos(…)BOOL SetWindowPos(const CWnd* pWndInsertAfter LPCRECT pCRectUINT 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//触发收缩时鼠标与窗口边界的最小间隔 单位为象素
lishixinzhi/Article/program/net/201311/15314
2019全球App月活跃用户排行榜上,存在20年已久的QQ依然位列全球第八、中国第四的位置,月活跃用户超过六个亿。QQ这款腾讯发家之作至今仍保持活跃得益于它强大的即时通讯属性、丰富的功能和优质的使用体验。QQ创意并非来自腾讯,而是完全照搬另一款产品,它的名字就是ICQ!
二十世纪末,互联网正处在快速普及阶段,很多重量级互联网产品都是在那个时候出现的。1996年,维斯格、瓦迪和高德芬格三个以色列人共同成立了Mirabilis公司,主要开发用于在互联网进行人与人沟通交流的软件。
公司成立同年,他们开发出了全世界第一款即时通讯软件(聊天软件),并将其命名为ICQ,即“I Seek You(我找你)”。通过ICQ,用户可以在互联网上实现发送消息、聊天、传递文件等功能。
Mirabilis公司将ICQ免费提供给用户,任何人都可以在网上申请ICQ账户并使用其功能。在免费策略下,ICQ用户量迅速增长,发布仅七个月后便突破100万,成为当时世界上用户最多的即时通讯软件。1998年,ICQ用户突破1000万,随即成立不足两年的ICQ被美国在线收购,收购价格高达4.07亿美元。ICQ也由此成为互联网史上创造财富最快的公司之一。
ICQ之所以能成功是因为它站在时代发展的风口上,它的出现是大势所趋。ICQ成功自然引来无数模仿者,其中最大模仿者就是:QQ。1999年,成立不久的腾讯公司在马化腾、张志东等人带领下,推出即时通信软件OICQ,几乎照搬了ICQ的所有功能。
OICQ用户增长迅速,发布当年就达到百万。由于名字过于相似,很快腾讯公司就收到来自ICQ母公司美国在线的律师函,要求其更改。马化腾想了想,便将其名字改为QQ,从此以后QQ这个模仿者将远远超越它的“老师”,成为中国乃至全世界最成功软件之一。
ICQ被美国在线收购以后,在美国及相关英语国家遭到以微软MSN和yahoo为首的同类软件竞争。最终,MSN凭借着与Windows *** 作系统深度捆绑,yahoo以海量用户作为依托,ICQ在竞争中逐渐败下阵来。
ICQ在发布之初只有英文版,英文地区被MSN和yahoo压制的同时,也给了非英文地区本土化即时通讯软件发展的机会。其中最具代表性的就是QQ,后期ICQ推出中文服务,但已为时已晚,中国市场已经是QQ的天下。在很多国家,ICQ都遇到类似情况,就这样,ICQ错失了全球化机会。
ICQ前期发展如此之快主要是免费,用户不需花一分钱。但企业需要盈利,这种情况下ICQ被迫将太多功能嵌入到其中。甚至很多看起来毫无内在关系的功能都被集成在一起,ICQ变得臃肿,随之而来的是用户体验的下降。
利用免费功能吸引用户,而后再用其他手段变现,这种做法无可厚非,但凡事有一个度,做过了就适得其反。QQ后来也犯了同样的错误,越来越多功能被加入进来,甚至连腾讯员工都不一定完全了解。直到2011年,腾讯推出移动兼简化版QQ“微信”后,才更上一层楼。
1998年,卖身美国在线后,ICQ动作频繁,新版本新功能不断出现。2005年,ICQ与香港电讯盈科合作推出粤语版ICQ 5,开始进军香港市场;在ICQ因为功能臃肿而用户量下降时,Mirabilis公司曾推出只含有最基本功能的简化版ICQ lite;2010年,美国在线将ICQ以1.875亿美元的价格卖给俄罗斯投资公司DST。
ICQ是世界上第一款即时通讯软件的缔造者,它启发了后来无数模仿者,但自身始终默默无闻。如今的即时通讯市场已经是QQ、微信、WhatsApp等的天下!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)