| |
|
|
Georg Hovenbitzer | Hallo zusammen,
beim nachfolgenden Code habe ich das Problem, dass nach der Übersetzung in der Variable &wParam nicht der richtig Wert enthalten ist. Es sollte der gleiche Wert sein wie Button&, ist aber bei mir immer 2. Alle anderen Werte stimmen ! KompilierenMarkierenSeparierenDef HiWord(1) (@&(1) $10000)
Declare Button&
WindowStyle 512 + 16 + 8 + 2
WindowTitle "Test"
Window 100,100-400,300
UserMessages $0021,$0111,$0010
~WM_MOUSEACTIVATE,~WM_COMMAND,~WM_CLOSE
Button& = @Create("Button",%hWnd,"rechts Klick?",100,100,200,100)
WhileNot %UMessage = $0010
WaitInput
If %UMessage =$0021 ~WM_MOUSEACTIVATE
Print &wParam
Print Button&
Print HiWord(&ULParam)
If (&wParam = Button&) And (HiWord(&ULParam) = $0204) ~WM_RBUTTONDOWN
Print "Treffer"
EndIf
EndIf
EndWhile
End
|
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 12.11.2005 ▲ |
|
|
|
|
Sebastian König | Hallo Georg,
leider scheint das eine der Situationen zu sein, in denen sich die unvermeidlichen kleinen Unterschiede im Message-Handling bemerkbar machen
Wenn ich das (mit Spy++) richtig ermittelt habe, stammt der Wert, der in &WParam steht, nicht von WM_MOUSEACTIVATE , sondern von einer vorangegangenen WM_SETCURSOR -Nachricht. Es ist also mehr oder weniger Zufall, dass das so passt und lässt sich wohl nicht mit Sicherheit reproduzieren...
Wenn es nur darum geht, den Rechtklick auf den Button abzufragen, müsste es besser funktionieren, WM_PARENTNOTIFY als UserMessage zu nehmen.
MfG
Sebastian |
|
|
| |
|
|
|
Georg Hovenbitzer | Hallo Sebastian,
danke für den Tip mit WM_PARENTNOTIFY. Nur wie bekomme ich nun an die Adresse von Button& ohne &wParam abzufragen ? Hast du da einen Tip für mich ? KompilierenMarkierenSeparierenDef HiWord(1) (@&(1) $10000)
Def LoWord(1) @&(1) & $FFFF
Declare Button&
WindowStyle 512 + 16 + 8 + 2
WindowTitle "Test"
Window 100,100-400,300
UserMessages $0111,$0010,$0210
~WM_MOUSEACTIVATE $0021
~WM_COMMAND $0111
~WM_CLOSE $0010
Wm_parentnotify $0210
Button& = @Create("Button",%hWnd,"rechts Klick?",100,100,200,100)
WhileNot %UMessage = $0010
WaitInput
If %UMessage =$0210 Wm_parentnotify
Print LoWord(&UwParam)," = ","516" ~WM_RBUTTONDOWN
Print "?"," = ",Button&
If (&wParam = Button&) And (LoWord(&UwParam) = 516) ~WM_RBUTTONDOWN
Print "Treffer"
EndIf
EndIf
EndWhile
End
|
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 13.11.2005 ▲ |
|
|
|
|
Georg Hovenbitzer | Hallo Sebastian,
ich habe ein Lösung gefunden die in der Übersetzten Version sehr gut funktioniert.
Ich lese mit GetCursorPos() die Mausposition aus und mit WindowFromPoint() welches Control sich darunter befindet. KompilierenMarkierenSeparierenDef GetCursorPos(1) !"USER32","GetCursorPos"
Def WindowFromPoint(2) !"USER32","WindowFromPoint"
Def Hiword(1) (@&(1) $10000)
Declare FSpeicher&
Declare TFSpeicher&
Declare MausPos#
Dim MausPos#,8
WindowStyle 512 + 16 + 8 + 2
Windowtitle "Test"
Window 0,0-800,600
Usermessages $0021,$0111,$0010
~WM_MOUSEACTIVATE,~WM_COMMAND,~WM_CLOSE
FSpeicher& = @Control("COMBOBOX","",$54310003,330,32,100,90,%hWnd,90,%hInstance)
TFSpeicher& = @Create("Tooltip",%hWnd,FSpeicher&,"siehe rechte Maustaste")
WhileNot %Umessage = $0010
WaitInput
If (%Umessage =$0021) And (Hiword(&Ulparam) = $0204)~WM_MOUSEACTIVATE
Clear MausPos#
GetCursorPos(MausPos#)
If (WindowFromPoint(@Long(MausPos#,0),@Long(MausPos#,4)) = FSpeicher&)~WM_RBUTTONDOWN
Print "Treffer"
EndIf
EndIf
EndWhile
Dispose MausPos#
End
|
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 14.11.2005 ▲ |
|
|
|
|
Sebastian König | Hallo Georg,
warst etwas schneller als ich Zur Vollständigkeit hier noch ein alternativer (aber ganz ähnlicher) Vorschlag:
Bei WM_PARENTNOTIFY wird (jedenfalls bei Mausereignissen) auch die aktuelle Mausposition in &ULParam (HiWord/LoWord) übergeben. Hier würde es also auch so funktionieren: KompilierenMarkierenSeparieren Achtung: ChildWindowFromPoint(), da die Koordinaten relativ sind.
MfG
Sebastian
P.S.: In Deinem Code ist der Aufruf Windowfrompoint(@Long(Mauspos#,0),@Long(Mauspos#,4)) nicht ganz richtig... es sollte einfach WindowFromPoint(Mouspos#) sein |
|
|
| |
|
|
|
Georg Hovenbitzer | Hallo Sebastian,
vielen Dank für den Tip. Bei WindowFromPoint muss ich dir wiedersprechen. Laut Win32.hlp und MSDN hast du zwar recht, aber es führt bei mir immer zu bösen Abstürzen. Wenn man hier in der API Datenbank schaut und im Internet, findet man immer meine Lösung mit zwei Parametern. |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 14.11.2005 ▲ |
|
|
|
|
Sebastian König | Hallo Georg,
ja, sorry - Du hast natürlich recht! Ich hatte die Doku wohl zu flüchtig gelesen und nicht realisert, dass die Funktion tatsächlich einen POINT (zusammengesetzt aus 2 Longs) und eben nicht die Adresse einer POINT-Struktur erwartet. Das gleiche gilt für ChildWindowFromPoint...
Nochmal sorry für die Verwirrung!
MfG
Sebastian |
|
|
| |
|
|
|
|
PS: Ich finde das Smilie so G**L. |
|
|
| |
|
|