QQ是现在很流行的即时通讯工具,它不仅拥有强大的功能,也具有非常友好的界面。这些友好的界面效果是如何做出来的?我们用VB来尝试一下!首先还是介绍QQ的自动隐藏功能:进入QQ主界面后,当我们把窗体拖到屏幕顶部的时候,同时移开鼠标,它就会自动隐藏,而当我们再次将鼠标移上的时候,窗体又会自动出现。这种功能不会对用户使用其他程序产生妨碍。
接下来,我们就来研究一下这样的效果是怎么做出来的。我们知道窗体的Top属性可以设置窗体距离屏幕顶的距离,如果把它设置成负值,窗体顶不就上去了,如果距离合适,不就是“隐藏”了吗?当然还得有一个“传感器”,用来探知当前窗体距离顶部的距离,当距离小于一定的距离时,我们才把窗体移上去。
下面介绍制作方法:
首先在Form1窗体上添加一个Timer控件,名称用默认的,将它的Interval属性设置为1(即1毫秒发生一次timer事件)。下面是程序:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Me.Top < 0 Then '鼠标移上时 判断窗体是否是隐藏
        Timer1.Enabled = False
        Me.Top = 30
    Else
        Timer1.Enabled = True
    End If
End SubPrivate Sub Timer1_Timer()
    If Me.Top <= 100 Then '当窗体距离屏幕顶端的距离小于100时 即自动隐藏
        Me.Top = 60 - Me.Height
    End If
End Sub程序很简单,就是效果不太好。有一个比较大的问题:当拖着标题栏到自动隐藏的范围内时,即使鼠标还在窗体的区域,窗体也会隐藏,这是因为在获得鼠标位置时使用了窗体的MouseMove事件,如果鼠标经过窗体的区域,肯定会触发该事件,所以我们需要找别的方法来判断是否位于窗体范围内。如果获得鼠标的位置呢?有这样的API函数可供使用。
在窗体的声明部分加入如下代码:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long'用于获取鼠标位置
Private Type POINTAPI'存储鼠标位置的类型
        X As Long
        y As Long
End Type
下面是改写过后的Timer控件的Timer事件
Private Sub Timer1_Timer()
    Dim pCursor As POINTAPI
    GetCursorPos pos '获取当前鼠标位置
    If Form1.Left < 15 * pCursor.X _
        And 15 * pCursor.X < Form1.Left + Form1.Width _
        And Form1.Top - 50 < 15 * pCursor.y _
        And 15 * pCursor.y < Form1.Top + Form1.Height + 50 Then'复杂的判断过程,判断鼠标是否位于窗体区域内
        If Form1.Top <= 0 Then Form1.Top = -10
    ElseIf Form1.Top <= 200 Then
        Form1.Top = 60 - Form1.Height
    End If
End Sub
同时要将窗体的MouseMove事件中的代码删除。
这样就已经很接近我们想要的效果了,为什么这么说呢,因为QQ窗体的伸缩是慢慢进行的,具有动画效果。为了得到这样的效果,我们仍然需要改进程序。
再次改进后的程序如下:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long '用于获取鼠标位置
Private Type POINTAPI '存储鼠标位置的类型
        X As Long
        y As Long
End TypePrivate Sub Timer1_Timer()
    Dim pCursor As POINTAPI
    GetCursorPos pCursor '获取当前鼠标位置
    If Form1.Left < 15 * pCursor.X _
        And 15 * pCursor.X < Form1.Left + Form1.Width _
        And Form1.Top - 50 < 15 * pCursor.y _
        And 15 * pCursor.y < Form1.Top + Form1.Height + 50 Then'复杂的判断过程,判断鼠标是否位于窗体区域内
        If Form1.Top <= 0 Then Call DownForm
    ElseIf Form1.Top <= 200 Then
        Call UpForm
    End If
End SubPrivate Sub UpForm()’窗体上移
    If Form1.Top <= 550 - Form1.Height Then
     Form1.Top = 50 - Form1.Height
     Exit Sub
    ElseIf Form1.Top < 50 - Form1.Height Then
     Exit Sub
    End If
    Form1.Top = Form1.Top - 500
End SubPrivate Sub DownForm()’窗体下移
    If Form1.Top >= -310 Then
     Form1.Top = 10
     Exit Sub
    End If
    Form1.Top = Form1.Top + 300
End Sub经过三步的讨论,我们终于做出了令人满意的结果,窗体可以自由伸缩了!程序在Win98/2000/XP+VB6.0下调试通过.