MouseLeaveを取得するには?

解決


かんとく  2009-06-26 09:37:33  No: 101855  IP: 192.*.*.*

お世話になっています。

WindowsXP,VB6です。

Picture1を配置し、それに対して、
MouseLeave(Picture1の範囲からマウスカーソルが外れたら起こるイベント)を取得することはできるでしょうか。

PictureBoxに限らず、CommandButtonやTextBoxでも、同様にMouseLeaveを取得したいです。

よろしくお願いします。

編集 削除
魔界の仮面弁士  2009-06-26 13:01:38  No: 101856  IP: 192.*.*.*

> MouseLeave(Picture1の範囲からマウスカーソルが外れたら起こるイベント)を取得することはできるでしょうか。

VB6 には MouseLeave イベント自体が存在していないので、
各コントロールごとに、個別に座標判断するしか無いと思います。

Option Explicit
Private Declare Function SetCapture Lib "USER32" (ByVal hWnd As OLE_HANDLE) As OLE_HANDLE
Private Declare Function ReleaseCapture Lib "USER32" () As Integer
Private mHWND As OLE_HANDLE

Private Sub MouseEnter(ByVal target As VB.Control)
    Debug.Print "Enter <- " & target.Name
End Sub

Private Sub MouseLeave(ByVal target As VB.Control)
    Debug.Print "Leave -> " & target.Name
End Sub

Private Sub Capture(ByVal target As VB.Control, X As Single, Y As Single)
    If mHWND <> target.hWnd Then
        mHWND = target.hWnd
        SetCapture mHWND
        MouseEnter target
    End If
    If X < 0 Or Y < 0 Or X > target.Width Or Y > target.Height Then
        ReleaseCapture
        MouseLeave target
    End If
End Sub

Private Sub Command1_MouseMove(Button%, Shift%, X!, Y!)
    Capture Command1, X, Y
End Sub

Private Sub Picture1_MouseMove(Button%, Shift%, X!, Y!)
    Capture Picture1, X, Y
End Sub

Private Sub Text1_MouseMove(Button%, Shift%, X!, Y!)
    Capture Text1, X, Y
End Sub

編集 削除
かんとく  2009-06-28 21:22:28  No: 101857  IP: 192.*.*.*

魔界の仮面弁士さん。
ありがとうございます。

ところで、FormにPictureBoxのみを置いた場合、一度PictureBox内にカーソルを入れて外に出したあと、もう一度PictureBox内にカーソルを入れると、
MouseEnterを取得できません。

    If X < 0 Or Y < 0 Or X > target.Width Or Y > target.Height Then

    End If

の間で、mHWND  をクリアすればよいと思うのですが、mHWND  をクリアするのはどうしたらよいでしょうか。
単に mHWND=0 でよいのでしょうか。

よろしくお願いします。

編集 削除
魔界の仮面弁士  2009-06-29 01:47:38  No: 101858  IP: 192.*.*.*

そうですね、0 を代入しておいてください。

Private Sub Capture(ByVal target As VB.Control, X As Single, Y As Single)
    If mHWND <> target.hWnd Then
        mHWND = target.hWnd
        SetCapture mHWND
        MouseEnter target
    End If
    If X < 0 Or Y < 0 Or X > target.Width Or Y > target.Height Then
        ReleaseCapture
        mHWND = 0   '★追加
        MouseLeave target
    End If
End Sub

編集 削除
かんとく  2009-06-29 12:10:21  No: 101859  IP: 192.*.*.*

ありがとうございます。

何度でも、MouseEnter、MouseLeaveを繰り返せるようになりました。

編集 削除