首页 > 未分类 > VB 如何得知Mouse已离开某物件

VB 如何得知Mouse已离开某物件

2008年5月7日 岩岩魂   访问量: 569 发表评论 阅读评论

VB中对Mouse的事件提供了MouseDown, MouseUp, MouseMove事件, 利用这三个事件, 我们可以方便地操纵大多数的Mouse行为, 但若要精确地控制Mouse事件, 这三个事件就有点无能为力了. 比如, 我们要在程序中实现以下简单的功能: 当鼠标在某个控件(如按钮)上时, 在状态条上显示该按钮的简单帮助, 离开这个控件时, 则隐藏该帮助. 要实现这个功能, 我们自然地想到要在控件的MouseMove事件上写入以下代码:

Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
StatusBar1.Panels(1).Text = "This is Command1"
End Sub

然后在Form_MoveMove中添加以下代码:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
StatusBar1.Panels(1).Text = ""
End Sub

按F5运行程序, 我们可以看到当鼠标移动到Command1上时, 在StatusBar的Panels(1)中显示出了帮助信息, 离开Command1时该帮助信息消失, 但你马上会发现该程序中有一个小小的Bug, 当Command1的位置在窗体的边缘时, 而你将鼠标从Command1上迅速移动到窗体外面, 您将发现StatusBar1的Panels(1)上的帮助信息仍然存在. 这显然没有实现我们预期的要求. 为什么会出现这种情况呢? 这是因为鼠标移动的速度太快, Form1中的Mouse_Move事件来不及触发, 当前鼠标的位置又不在Form1上, 这样, 帮助信息自然不会消失了.

要实现这个功能, 我们认识到光用VB提供的Mouse_Move事件是有缺陷的, 我们应该捕捉Command1的Mouse_Leave事件, 在该事件下输入StatusBar1.Panels(1).Text = "", 这样才能完美地实现预期的要求.

而VB中并没有提供Mouse_Leave事件, 怎样才能捕捉到该事件呢? 这就要求助于API函数了.
在众多的WindowAPI函数中, 有两个函数可以帮助我们实现这个功能: SetCapture和ReleaseCapture .

在窗体中添加以下声明:

Private Declare Function SetCapture Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long

在窗体中添加一个命令按钮, 命名为Command2
在Command2的MouseMove事件中, 添加以下代码:

Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim MouseOver As Boolean
'判断当前鼠标位置是否在Command2上
MouseOver = (0 <= X) And (X <= Command2.Width) And (0 <= Y) And (Y <= Command2.Height)

If MouseOver Then
' MouseOver 事件
' 假如鼠标在Command2上, 则利用SetCapture将每一个鼠标事件都传递给Command2
' 并在StatusBar1.Panels(1)上显示帮助信息
StatusBar1.Panels(1).Text = "This is Command2"
SetCapture Command2.hWnd
Else
' MouseLeave 事件
' 假如鼠标不在Command2上, 则利用SetCapture释放鼠标捕捉
' 并清除在StatusBar1.Panels(1)上的帮助信息
StatusBar1.Panels(1).Text = ""
ReleaseCapture
End If
End Sub

按F5运行程序, 试试看, 不管你的鼠标移动速度有多快, 也不管Command2的位置在那里, 程序都能准确地响应你的Mouse事件. 将以上程序作一些小小的变动, 比如, 当MouseOver时, 修改Command2的Font.Bold属性, 将它设为True, MousLeave时设为False, 或修改ForeColor属性, 在MouseOver和MouseLeave中设成不同的颜色, 将大大增强你的VB程序的界面.  

相关文章:

  1. VB 判断鼠标是否离开控件
  2. [转]编程之路-界面美化
  3. VB 类按键精灵源码
  4. 自制控件方面的有关知识
  5. 在Vb下实现多线程
分类: 未分类 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.