 |
作者的思路基本上是对的,主要是实现方式上不太妥当,应该把窗体的隐藏和显示放在一个计时器内,这样执行的效果就基本上满足需求了,我更改后的源码如下:
'注意
1:要使得执行效果最好,请把窗体的BorderStyle=0
2:计时器的执行频率设为20左右,移动过程较为平滑
3: 由于窗体隐藏的条件为Me.Top <= 100 所以请自已加上移动窗体的代码,当移动窗体到me.top <=100左右时,再移开鼠标,将开始隐藏窗体.
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private mybShow As Boolean '模块变量,进行显示还是隐藏
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim MouseEnter As Boolean
MouseEnter = (0 <= X) And (X <= Me.Width) And (0 <= Y) And (Y <= Me.Height) '计算鼠标的移动是否在窗体上
If MouseEnter Then '鼠标已经进入,进行显示
If Me.Top < 0 Then
mybShow = True
Timer1.Enabled = True
End If
SetCapture Me.hwnd
Else '鼠标已经离开
If Me.Top <= 100 Then '如顶部露在外面,则进行隐藏
mybShow = False
Timer1.Enabled = True
End If
ReleaseCapture
End If
End Sub
Private Sub Timer1_Timer()
If mybShow Then '显示
If Me.Top < -100 Then
Me.Top = Me.Top + 100
Else
Me.Top = 0
Timer1.Enabled = False
End If
Else
If Me.Top + Me.Height > 100 Then '底部露在外面,进行隐藏
Me.Top = Me.Top - 100
Else
Me.Top = 10 - Me.Height
Timer1.Enabled = False
End If
End If
End Sub
'另外我加了下面的语句,使你的窗体始终置于顶上,这样,当用户在使用其他程序时,还可以响应到鼠标的进入.
Private Sub Form_Load()
me.Top =0
SetWindowPos Me.hwnd, HWND_TOPMOST, Me.Left, Me.Top, Me.Width, Me.Height, SWP_NOMOVE Or SWP_NOSIZE
End Sub
此问题由wenejiang回答。
附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 窗体与菜单, form, window, tform。
|