模拟MouseEnter,MouseExit事件

2008-04-09 04:39:36来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  很多第三方的控件都提供的 MouseEnter 和 MouseExit 事件来补充 MouseMove 事件的不足(MouseMove 事件不能有效的捕获鼠标是否已在控件外),但是这些控件或要注册,或集合了其他实际没有什么作用控件,另外在程序中加入太多的控件也会影响程序的性能,利用 Windows 的 API 函数,我们可以在 MouseMove 中模拟 MouseEnter 和 MouseExit,虽然我提供的源代码中没有真正的这两个事件,但的确提供了这两个事件所具备的功能。好了!让我们实现吧。

  首先加载一个模块,在模块中声明以下两个 API 函数:

Public Declare Function SetCapture Lib "user32" _

(ByVal hwnd As Long) As Long

Public Declare Function ReleaseCapture Lib "user32" () As Long

  SetCapture 的功能是:设置鼠标捕获指定的窗口(Windows 每个控件都是一个窗口。比如桌面上显示的图标就是一个窗口,其实是两个,另一个显示描述这个图标的文本),系统将收到这个窗口所有的鼠标移动或击按的所有信息。

ReleaseCapture 的功能是:取消捕获鼠标信息。

  Windows 系统就是一个消息系统,系统一直在等待用户的消息,并加一相应,但处理完一个消息后,系统有处以下一轮的等待。消息传递是 Windows 的核心。

  让我们在 Form1 中放置一个按钮或其他控件,但此控件必须具有窗口句柄(hWnd),比如 VB 提供的 Image 控件是一个次图形控件,没有窗口句柄,而 Picture,Command Button 等控件就有窗口句柄,我们就拿 Command Button 来作示范,在 Form1 上放置一个 Command Button,在 Command1_MouseMove()事件内加入以下代码:

Private Sub Command1_MouseMove(Button As Integer, _

Shift As Integer, X As Single, Y As Single)

With Command1

当鼠标在越出控件外

If Not ((X $#@60; 0) Or (Y $#@60; 0) Or _

(X $#@62; .Width) Or (Y $#@62; .Height)) Then

鼠标指针在按钮外时,让其他控件也收到标事件

ReleaseCapture

为了不让 MouseMove 事件反复触发

If .Caption $#@60;$#@62; "outside" Then

.Caption = "outside"

E If

| 鼠标指针在按钮上,捕获他但鼠标移出是我们将收到鼠标事件

SetCapture .hwnd

Else

.Caption = "inside"

End If

End With

End Sub

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:面向VB编程人员的COM 综述

下一篇:实现图像缩放的一种方法