お世話になっています。
WindowsXP,VB6です。
Picture1を配置し、それに対して、
MouseLeave(Picture1の範囲からマウスカーソルが外れたら起こるイベント)を取得することはできるでしょうか。
PictureBoxに限らず、CommandButtonやTextBoxでも、同様にMouseLeaveを取得したいです。
よろしくお願いします。
> 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
魔界の仮面弁士さん。
ありがとうございます。
ところで、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 でよいのでしょうか。
よろしくお願いします。
そうですね、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
ありがとうございます。
何度でも、MouseEnter、MouseLeaveを繰り返せるようになりました。