QQ窗体自动隐藏效果探究

本文详细探讨了如何使用Delphi实现QQ窗体自动隐藏的效果,包括问题提出、基本分析、初步实现和进一步完善。通过拦截WM_MOVING消息,设置计时器监控鼠标位置,结合TAnchors集合描述窗体隐藏位置,最终实现窗体在屏幕四边自动隐藏和显示。在进一步完善部分,解决了窗体隐藏在屏幕四角时的闪烁问题,使其能自动充满屏幕两边。
摘要由CSDN通过智能技术生成

腾讯QQ是当前流行的网络聊天工具之一,由于它在应用设计上有很多独特之处,所以也吸引了很多程序员对之进行研究和模仿。在这里,我将利用DelphiQQ的窗体自动隐藏效果提出自己的实现方法。

一、问题的提出

熟悉QQ使用的朋友都知道,当QQ窗体区域超出屏幕四边时,窗体就会自动“消失”,只留下窗体一边的小部分显露在桌面上。当用鼠标移动到显露部分之上,窗体就会在隐藏位置重新完整显示;但当鼠标离开窗体区域后,窗体便会重新进入隐藏状态。

对隐藏的全过程进行分析,可以得出两点推测:第一,窗体隐藏的处理是与窗体移动过程有关;第二,窗体隐藏的触发条件是窗体的区域已经移动到屏幕的可视范围之外。

对第一点推测,可以通过对窗体移动时产生的Windows消息进行拦截处理加以实现。对第二点推测,如何去表示“窗体区域已经超出屏幕可视范围”这一条件成为实现的关键。

二、基本的分析

让我们先留意一下Windows环境下窗体移动的过程与效果。当使用鼠标移动窗体的时候,窗体本身并没有立刻随鼠标的移动而发生位置的改变;相反,鼠标正在拖动的是一个大小与窗体一致的透明区域(确切的说一个虚线边框的矩形)。当鼠标释放矩形后,窗体本身才会在矩形最后停留的地方出现,从而完成整个移动的过程。(注意:在Windows 2000XP环境下,如果在显示属性中选中“拖动时显示窗体内容”的显示效果选项,则上述过程无法观察。)

QQ窗体,其移动过程与上述无异,但却有一处不同。当我们把矩形移动到屏幕四边且已有部分超出时,矩形就会自动地停留在超出位置上并完整显示。此时不论我们怎样试图把矩形再向超出方向上移动,矩形也只保持在该位置。当释放鼠标之后,窗体的隐藏效果也就出现了。

从上述过程可以推断,触发隐藏条件后,即使仍处于移动过程但矩形本身却已经被锁定,因此对窗体位置的判断是发生在移动过程中,也就是说我们要拦截处理的Windows消息是WM_MOVING。其次,在移动过程中首先发生位置变化的是矩形而不是窗体本身,因此实现隐藏的关键是对矩形参数的判断与设置。

我们可以先留意一下WM_MOVING消息的语法结构:

    WM_MOVING

WPARAM wParam

LPARAM lParam

其中,WPARAM不被使用,而LPARAM则是一个指针,所指向的是一个RECT结构。RECT结构中包含了LeftTopRightBottom四个参数,分别用于描述矩形的左上角与右下角,“该RECT记录了窗体相对于屏幕的当前位置;当要改变拖动矩形的位置时,程序本身必须改变RECT结构中各成员变量的相关值”。由此可知,我们要处理的矩形其实已经在WM_MOVING消息中被提到,我们要处理的也就是LPARAM所指向的RECT结构的有关参数。

接下来我们要设置一个由隐藏条件激活的计时器,目的是监控鼠标相对窗体的位置。因为窗体隐藏后的隐现是靠鼠标激活的,所以若检测到鼠标位于窗体之上,则说明窗体在显示状态;反之,窗体在隐藏状态。我们只需在相关的判断下加入对窗体TopLeft属性的赋值即可实现隐现效果。

至此,有关自动隐藏效果的实现分析就基本完成了。不过还要注意一点,因为我们是在WM_MOVING消息的拦截处理中判断隐藏条件,而通过计时器的OnTimer事件处理隐现效果。在此隐藏条件是否满足在两个过程中的传递将成为关键。同时我们要知道的不仅是隐藏条件是否满足,还必须知道窗体是在屏幕的那一边上发生隐藏。为此,我们需要定义一个集合去描述窗体隐藏的位置,例如:

type

  HidePosKind = (hpTop,hpLeft,hpBottom,hpRight);

type

  THidePos = set of HidePosKind;

不过,类似的集合在Delphi本身就已经存在,譬如TAnchors集合。TAnchors集合原来是用于指明一个控件如何锚定于其父类控件的位置,我们在这里则借用来描述窗体对屏幕的隐藏位置。

TAnchors集合中也包含了四个值,其定义如下:

type TAnchorKind = (akTop, akLeft, akRight, akBottom);

type TAnchors = set of TAnchorKind;

在代码的实现中,我们将定义一个TAnchors类型的全局变量FAnchors去描述窗体隐藏的位置。

三、初步的实现

首先我们定义一个过程对WM_MOVING消息进行拦截处理,代码如下:

……

private

FAnchors: TAnchors;

procedure WMMOVING(var Msg: TMessage); message WM_MOVING;

……

uses Math,type;

procedure TForm1.WMMOVING(var Msg: TMessage);

begin

 inherited;

 with PRect(Msg.LParam)^ do

 begin

   Left := Min(Max(0, Left), Screen.Width - Width);

   Top := Min(Max(0, Top), Screen.Height - Height);

   Right := Min(Max(Width, Right), Screen.Width);

   Bottom := Min(Max(Height, Bottom), Screen.Height);

 

   FAnchors := [];

   if Left = 0 then Include(FAnchors, akLeft);

   if Right = Screen.Width then Include(FAnchors, akRight);

   if Top = 0 then Include(FAn

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Delphi QQ自动隐藏是指在使用Delphi编程语言创建的QQ软件中实现自动隐藏功能。自动隐藏功能是一种在软件或应用程序中常见的用户界面设计特性,旨在提供更大的屏幕空间,以便用户可以更好地使用其他应用程序或窗口。 实现Delphi QQ自动隐藏的核心思想是监测用户的操作行为,当用户将鼠标光标移出QQ窗口时,程序自动隐藏QQ界面,将其最小化或缩小成较小的窗口,以便其他应用程序的窗口可以更好地展示在屏幕上。当用户再次将鼠标光标移回QQ窗口时,程序会自动还原QQ界面,使其恢复到正常大小。 实现Delphi QQ自动隐藏的方法之一是通过使用代码来控制窗口的可视状态。通过捕获并处理鼠标事件,我们可以在用户将光标移出QQ窗口时,调用最小化或缩小窗口的方法,从而达到自动隐藏效果。当用户再次将光标移回QQ窗口时,调用还原窗口的方法,使其恢复原来的大小和位置。 此外,我们还可以使用定时器来实现自动隐藏功能。通过在短时间内检测用户的鼠标位置是否在QQ窗口上,从而判断用户是否正在操作QQ窗口。当用户不进行操作时,即使鼠标在窗口上,也可以触发自动隐藏功能,以提供更大的屏幕空间给其他应用程序。 综上所述,Delphi QQ自动隐藏是一种在Delphi编程语言中实现的QQ功能,通过捕捉鼠标事件或使用定时器,监测用户的操作行为,实现自动隐藏功能,以提供更大的屏幕空间和更好的用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值