众所周知可以通过调用SetCapture和ReleaseCapture模拟控件对象的MouseExit事件
但没有窗口句柄的label控件的MouseExit属性该如何写?
另外网上有没有提供MouseExit事件的label控件下载?如果有请给出下载地址,必须要求具备label的背景透明功能
不要给出利用Form_MouseMove的方法,太浪费系统资源,而且这种方法在控件比较多的情况下编写代码太繁琐!
请各位帮帮忙!

解决方案 »

  1.   

    Windows提供的鼠标移出消息有时候很有用,但是VB6中没有把这个事件封装给我们。
    但是我们仍然可以使用子类化技术实现他,下面的代码就是一个简单的例子来处理Windows的
    WM_MOUSELEAVE消息的,我演示的是鼠标移出一个Button时的情形。1.加入一个模块,专门用来处理子类函数:Option Explicit'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Copyright 2002 40Star, All Rights Reserved.
    '
    'E-Mail      :[email protected]
    'Distribution:你可以完全自由随便的使用这段代码,不管你用于任何目的
    '              程序在于交流和学习
    '              如有任何BUG请和我联系
    '
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As String) As LongPrivate Declare Function GetWindowLong Lib "user32" Alias _
        "GetWindowLongA" (ByVal hwnd As Long, _
        ByVal nIndex As Long) As LongPrivate Declare Function SetWindowLong Lib "user32" Alias _
            "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
            As Long, ByVal dwNewLong As Long) As Long
            
    Private Declare Function CallWindowProc Lib "user32" Alias _
            "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal _
            hwnd As Long, ByVal Msg As Long, ByVal wParam As _
            Long, ByVal lParam As Long) As Long
      
    Const GWL_WNDPROC = (-4&)Dim PrevWndProc&Private Const WM_DESTROY = &H2
    Public Declare Function TrackMouseEvent Lib "user32" (lpEventTrack As TRACKMOUSEEVENTTYPE) As LongPublic Const TME_CANCEL = &H80000000
    Public Const TME_HOVER = &H1&
    Public Const TME_LEAVE = &H2&
    Public Const TME_NONCLIENT = &H10&
    Public Const TME_QUERY = &H40000000Private Const WM_MOUSELEAVE = &H2A3&Public Type TRACKMOUSEEVENTTYPE
        cbSize As Long
        dwFlags As Long
        hwndTrack As Long
        dwHoverTime As Long
    End TypePublic bTracking As Boolean
    Dim evtTrack As TRACKMOUSEEVENTTYPE
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Function SubWndProc(ByVal hwnd As Long, ByVal Msg As Long, _
                                ByVal wParam As Long, ByVal lParam As Long) _
                                As Long   If Msg = WM_DESTROY Then Terminate (hwnd)   '处理鼠标移出消息
       If Msg = WM_MOUSELEAVE Then
          bTracking = False
          Form1.Print "The mouse left the form!"
       End If
       SubWndProc = CallWindowProc(PrevWndProc, hwnd, Msg, wParam, lParam)
    End FunctionPublic Sub Init(hwnd As Long)
      PrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubWndProc)
    End SubPublic Sub Terminate(hwnd As Long)
      Call SetWindowLong(hwnd, GWL_WNDPROC, PrevWndProc)
    End Sub' -- 模块结束 -- '2. 窗体中处理需要加入的代码:Option ExplicitPrivate Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If bTracking = False Then
       bTracking = True
        Dim ET As TRACKMOUSEEVENTTYPE
        'initialize structure
        ET.cbSize = Len(ET)
        ET.hwndTrack = Command1.hwnd
        ET.dwFlags = TME_LEAVE
        'start the tracking
        TrackMouseEvent ET
    End If
    End SubPrivate Sub Form_Load()
    Call Init(Command1.hwnd)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    Call Terminate(Command1.hwnd)
    End Sub
      

  2.   

    to  zqfleaf(啊风)
    你给出的代码好复杂啊!估计完全看懂都要花不少的时间
    CommandButton控件有hwnd窗口句柄,而label控件不具备hwnd窗口句柄,以上的代码用在label控件上是否也行得通?你试过没有?
      

  3.   

    轻控件事没有句柄的阿!这种一点的办法,捕捉窗体的mousermove事件罗Option ExplicitPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Select Case Me.Tag
            Case "Label1"
                 Label1.Caption = "MouseOut"
                Me.Tag = ""
                
            Case "Label2"
                Label2.Caption = "MouseOut"
                Me.Tag = ""
            
            Case "Label3"
                Label3.Caption = "MouseOut"
                Me.Tag = ""
            
        End Select
    End SubPrivate Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Label1.Caption = "MouseIN"
        Me.Tag = "Label1"
    End SubPrivate Sub Label2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
         Label2.Caption = "MouseIN"
        Me.Tag = "Label2"
    End Sub
    Private Sub Label3_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Label3.Caption = "MouseIN"
        Me.Tag = "Label3"
    End Sub
      

  4.   


    Private Sub Form_Load()
        Label1.ForeColor = vbBlue
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Label1.ForeColor = vbBlue
    End SubPrivate Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Label1.ForeColor = vbRed
    End Sub
      

  5.   

    大家为什么不仔细看完我的贴子再回贴呢?我前面说了不要给出利用Form_MouseMove的方法,太浪费系统资源,而且这种方法在控件比较多的情况下编写代码太繁琐!
    难道就没有其它更好的办法了吗?
    高手请指教
      

  6.   

    真的没有别的办法吗?如果我是要控制轮换图片的话,用Form的MouseMove太浪费系统资源了!
      

  7.   

    我想过有一种办法可能行得通。就是用ActiveX技术编写自己的label控件,给控件加上hwnd属性!
    关键是hwnd属性该如何写?有没有介绍相关知识的资料或书籍下载?
    自己UP
      

  8.   

    于Label控件的MouseMove中以窗体句柄捕获鼠标,以Label大小设定范围,移出后释放
    不过我是弄了个无图的Image上去
      

  9.   

    Label下一层再放一个稍大一点的Label吗,大的Label写移出代码.明白了吗?
      

  10.   

    to skywolfY(莫愁) 
    能否说得再详细点?给个例子代码
      

  11.   

    为什么非得用Label
    用textbox不行吗
      

  12.   

    如果你能把TEXTBOX的边框去掉,再变成透明,那就行了!
      

  13.   

    在label控件下放一个稍大一点的picture控件,考虑他的mouseexit事件