欢迎来到天天文库
浏览记录
ID:47852931
大小:70.00 KB
页数:9页
时间:2019-11-28
《QQ窗体自动隐藏效果探究》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、QQ窗体自动隐藏效果探究腾讯QQ是X前流行的网络聊夭匚具之一,山于它在应用设计上冇很多独特Z处,所以也吸引了很多程序员对之进行研究和模仿。在这里,我将利川Delphi对QQ的窗体〔I动隐藏效果捉出〔I己的实现方法。一・问题的提出熟悉QQ使用的朋友都知道,当QQ窗体区域超出屏幕四边吋,窗体就会自动“消失”,只留下窗体-边的小部分显露在桌而上。当用鼠标移动到显露部分之上,窗体就会在隐藏位置重新完整显示;但当鼠标离开窗体区域后,窗体便会重新进入隐藏状态。对隐藏的全过程进行分析,对以得出两点推测:第一,窗体隐藏的处理是耳窗体移动过程冇关
2、;第二,窗体隐藏的触发条件是窗体的区域已经移动到屏幕的可视范围之外。对第-点推测,可以通过对窗体移动吋产生的Windows消息进行拦截处理加以实现。对第二点推测,如何去表示“窗体区域已经超出屏幕可视范围”这--条件成为实现的关键。%1.基本的分析让我们先留总一下Windows环境下窗体移动的过程与效果。X使用鼠标移动窗体的时候,窗体木身并没冇立刻随鼠标的移动而发生位置的改变;相反,鼠标正在拖动的是一个大小耳窗体一致的透明区域(确切的说一个虚线边框的矩形)。半鼠标释放矩形后,窗体木身才会在矩形最后停留的地方出现,从而完成整个移动的
3、过程。(注总:在Windows2000及XP环境下,如果在显示属性中选中“拖动时显示窗体内容”的显示效果选项,则上述过程无法观察。)对QQ窗体,其移动过程与上述无并,但却有一处不同。当我们把矩形移动到屏幕四边且已有部分超出时,矩形就会自动地停留在超出位置上并完整显示。此时不论我们怎样试图把矩形再向超出方向上移动,矩形也只保持在该位置。当释放鼠标之后,窗体的隐藏效果也就出现了。从上述过程可以推断,触发隐藏条件后,即使仍处于移动过程但矩形本身却已经被锁定,因此对窗体位置的判断是发生在移动过程中,也就是说我们要拦截处理的Windows
4、消息是W.V1HOVING。其次,在移动过程中首先发生位胃•变化的是矩形而不是窗体本身,因此实现隐藏的关键是对矩形参数的判断与设置。我们可以先留意一下WMJ10VING消息的语法结构:WMMOVINGWPARAMwParamLPARAM1Param,其中,WPARAM不被使用,而LPARAM则是一个指针,所指向的是一个RECT结构。RECT结构中包含了Left、Top.Right.Bottom四个参数,分别用于描述矩形的左上角与右下角,“该RECT记录了窗体相对于屏幕的当前位置;当要改变拖动矩形的位置时,程序本身必须改变RECT
5、结构中各成员变量的相关值”。曲此可知,我们要处理的矩形其实己经在WMOVING消息中被提到,我们要处理的也就是LPARAM所指向的RECT结构的有关参数。接下来我们要设置一个由隐藏条件激活的计时器,H的是监控魏标相对窗体的位置。因为窗体隐藏后的隐现是靠駅标激活的,所以若检测到駅标位于窗体之上,则说明窗体在显示状态;反乙窗体在隐藏状态。我们只需在相关的判断下加入对窗体Top利Left属性的赋值即可实现隐现效果。至此,有关自动隐藏效果的实现分析就基本完成了。不过还要注意一点,因为我们是在側MOVING消息的拦截处理中判断隐藏条件,而
6、通过计时器的OnTimer^件处理隐现效果。在此隐藏条件是否满足在两个过程中的传递将•成为关键。同时我们要知道的不仅是隐藏条件是否满足,还必须知道窗体是在屏幕的那…边上发生隐藏。为此,我们需要定义…个集合去描述窗体隐藏的位置,例如:typeHidePosKind=(hpTop,hpLeft,hpBottom,hpRight);typeTHidePos=setofHidePosKind;不过,类似的集合在Delphi木身就已经存在,譬如TAnchors集合。TAnchors集合原來是用于指明-•个控件如何锚定于其父类控件的位置,我
7、们在这里则借用來描述窗体对屏幕的隐藏位置。在TAnchors集合中也包含了四个值,其定义如下:typeTAnchorKind=(akTop,akLeft,akRight,akBottom);typeTAnchors=setofTAnchorKind;在代码的实现中,我们将定义一个TAnchors类型的全局变量FAnchors去描述窗体隐藏的位置。%1.初步的实现首先我们定义一个过程对WMMOVTNG消息进行拦截处理,代码如下:privateFAnchors:TAnchors;procedureM10VTNG(varMsg:TMe
8、ssage);messageWMMOVTNG;usesMath,type;procedureTForml.M10VTNG(varMsg:TMessage);begininherited;withPRect(Msg.LParam)dobeginLeft:=Min(
此文档下载收益归作者所有