Mausereignisse per subclassing: Mousedown?, -up?

19/03/2010 - 16:29 von Thomas Hoffmann | Report spam
Tag,
ich verwende code von Peter Götz von http://www.gssg.de/vbmouse.htm .
Ich subclasse via
mV.PtrWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WProc)
eine picbox. (mV: modulglobaler Datentyp, PtrWndProc ist long)

Die Auswertung der wMsg von WM_MOUSEWHEEL in der function

Function WProc(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

geht ohne Probleme.

bei den Mousedown und -upereignissen komme ich nicht klar

bei Mousedown werden über die Zeile
Debug.Print Hex(GetHighWord(wParam)), Hex(GetLowWord(wParam)), Hex(GetHighWord(lParam)),
Hex(GetLowWord(lParam))
(in WProc)
folgende 5 Zeilen ausgegeben: (Beispiel)
0 0 9D 92
0 0 9D 92
10 9A 201 12
10 96 201 12
0 12 9D 92

bei mouseup 4 Zeilen:
0 0 9D 92
0 0 9D 92
10 96 202 12
0 12 9D 92

Wie wertet man denn die mousedown und mouse-up-Ereignisse in WProc aus?

Gruß und Dank



Thomas Hoffmann
 

Lesen sie die antworten

#1 Thorsten Albers
19/03/2010 - 18:49 | Warnen spam
Thomas Hoffmann schrieb im Beitrag
<ho056t$6ge$03$...
Wie wertet man denn die mousedown und mouse-up-Ereignisse in WProc aus?



Nur 'mal so als schematisches Beispiel

-
Private Declare Function GetAsyncKeyState _
Lib "user32" _
Alias "GetAsyncKeyState" _
( _
ByVal vKey As Long _
) As Integer


Function WProc(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Const WM_MOUSEFIRST As Long = &H200
'Const WM_MOUSEMOVE As Long = &H200
Const WM_LBUTTONDOWN As Long = &H201
Const WM_LBUTTONUP As Long = &H202
'Const WM_LBUTTONDBLCLK As Long = &H203
Const WM_RBUTTONDOWN As Long = &H204
Const WM_RBUTTONUP As Long = &H205
'Const WM_RBUTTONDBLCLK As Long = &H206
Const WM_MBUTTONDOWN As Long = &H207
Const WM_MBUTTONUP As Long = &H208
'Const WM_MBUTTONDBLCLK As Long = &H209
Const WM_MOUSELAST As Long = &H209

Const MK_LBUTTON As Long = &H1
Const MK_RBUTTON As Long = &H2
Const MK_SHIFT As Long = &H4
Const MK_CONTROL As Long = &H8
Const MK_MBUTTON As Long = &H10

Const VK_MENU As Long = &H12

Dim X As Single, Y As Single
Dim Button As Integer, Shift As Integer


If (wMsg >= WM_MOUSEFIRST) And (wMsg <= WM_MOUSELAST) Then

Select Case wMsg

Case WM_LBUTTONDOWN, _
WM_LBUTTONUP, _
WM_RBUTTONDOWN, _
WM_RBUTTONUP, _
WM_MBUTTONDOWN, _
WM_MBUTTONUP

X = CSng(GetLowWord(lParam))
Y = CSng(GetHighWord(lParam))

If (wParam And MK_LBUTTON) Then
Button = Button Or vbLeftButton
End If

If (wParam And MK_RBUTTON) Then
Button = Button Or vbRightButton
End If

If (wParam And MK_MBUTTON) Then
Button = Button Or vbMiddleButton
End If

If (wParam And MK_SHIFT) Then
Shift = Shift Or vbShiftMask
End If

If (wParam And MK_CONTROL) Then
Shift = Shift Or vbCtrlMask
End If

If GetAsyncKeyState(VK_MENU) < 0 Then
Shift = Shift Or vbAltMask
End If

' *****

End Select ' -- wMsg

End If ' -- (wMsg >= WM_MOUSEFIRST) And (wMsg <= WM_MOUSELAST)

End Function
-

Ab ***** kann jetzt mit X, Y, Button und Shift wie in einer VB-MouseDown-
und -MouseUp-Ereignisprozedur weitergearbeitet werden.
Natürlich muß man die Daten nicht in VB-Form umsetzen, sondern kann ggfs.
gleich auf MK_SHIFT etc. prüfen - es soll nur die Bedeutung der
Nachrichten-Parameter in der Windows-Prozedur darstellen.

Thorsten Albers

albers (a) uni-freiburg.de

Ähnliche fragen