http://seraphic_zju.52blog.net/logs/2365433.html
实现功能:像QQ那样当窗体被移动到屏幕的最上方时,当鼠标不在窗体范围内时窗体自动浮动上升到屏幕上方,(此时窗体露出很小一个尺寸在屏幕范围内),当鼠标移动到窗体内时窗体自动下降到屏幕内。
我曾经尝试过用vb6.0来实现这个功能。现在发现6.0实在是比较弱,在获得鼠标坐标的时候要调用API函数。而.net中直接有me.mouseposition.x和me.mouseposition.y属性,使用起来相当方便。
以下来分析下要实现这个功能要考虑哪些问题。
1.什么时候窗体自动上升?
当窗体被移动到屏幕上方以外或者在临界位置,即me.location.y<=0时
2.什么时候窗体自动下降?
当鼠标移动到窗体上时,并且此时窗体处于屏幕上方或者正在向上放移动过程中。
3.窗体上升时上升到什么位置?
要保证窗体的一部分在屏幕内,这样以后才能把鼠标移动到窗体上使之下降。在这里我取得尺寸是3twip.
小于3twip是不合适的。
okay,考虑完这些问题,看看该怎么实现的,需要用到哪些事件,控件。。。
timer要用到两个,一个用来实现上升。一个用来实现下降。
判断鼠标是否在窗体内直接用鼠标的坐标来判断。虽然mousemove,mousehover可以判断鼠标是否在窗体内,但当鼠标在标题栏上是无法判断的。因为鼠标在标题栏上时是不触发mousemove和mousehover时间的。
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With Timer1
.Enabled = True
.Interval = 1
End With
With Timer2
.Enabled = True
.Interval = 1
End With
End Sub
Private Sub Tier1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Control.MousePosition.X >= Me.Location.X And Control.MousePosition.X <= Me.Location.X + Me.Width And Control.MousePosition.Y >= Me.Location.Y And Control.MousePosition.Y <= Me.Location.Y + Me.Height Then
Timer2.Enabled = False
If Me.Location.Y <= 0 Then
Me.Location = New Point(Me.Location.X, 0)
End If
Else
Timer2.Enabled = True
End If
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
Dim i As Int16
Dim size As Decimal
If Me.Location.Y <= 0 And Me.Location.Y + Me.Height > 3 Then
i = 5
size = (Me.Location.Y + Me.Height - 3) / 5
For i = 1 To 5
Me.Location = New Point(Me.Location.X, Me.Location.Y - size)
Next i
End If
End Sub
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With Timer1
.Enabled = True
.Interval = 1
End With
With Timer2
.Enabled = True
.Interval = 1
End With
End Sub
Private Sub Tier1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Control.MousePosition.X >= Me.Location.X And Control.MousePosition.X <= Me.Location.X + Me.Width And Control.MousePosition.Y >= Me.Location.Y And Control.MousePosition.Y <= Me.Location.Y + Me.Height Then
Timer2.Enabled = False
If Me.Location.Y <= 0 Then
Me.Location = New Point(Me.Location.X, 0)
End If
Else
Timer2.Enabled = True
End If
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
Dim i As Int16
Dim size As Decimal
If Me.Location.Y <= 0 And Me.Location.Y + Me.Height > 3 Then
i = 5
size = (Me.Location.Y + Me.Height - 3) / 5
For i = 1 To 5
Me.Location = New Point(Me.Location.X, Me.Location.Y - size)
Next i
End If
End Sub
End Class
最后要注意的是判断鼠标是否在窗体上的时候要用到等号否者鼠标在窗体上边界时会上下弹动。
作者原先代码有些错误,以上代码是由作者的代码修改的,vb.net2005测试可行。