MouseLeaveを取得するには?

解決


かんとく  2009-06-26 18:37:33  No: 101855

お世話になっています。

WindowsXP,VB6です。

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

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

よろしくお願いします。


魔界の仮面弁士  2009-06-26 22:01:38  No: 101856

> 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-29 06:22:28  No: 101857

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

ところで、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 10:47:38  No: 101858

そうですね、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 21:10:21  No: 101859

ありがとうございます。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加