Seite 1 von 1

Subclassing - MouseNotOver

Verfasst: 24.10.2005 01:02
von ts-soft
Ich hab für einen Button ein Subclassing Callback erstellt, also eins, das nur die Ereignisse des Buttons erhält!!!
Wie kann ich erfahren, wann die Maus nicht mehr über den Button ist. Dieses Ereignis muß aber in dem Subclassing Callback auftreten. Also irgenwas wie #WM_LOST???? oder so ähnlich, bzw. gibts da was???

Verfasst: 24.10.2005 02:03
von nicolaus
Schau dir mal WindowFromPoint() aus der API an damit kannst du anhand der cursordaten abfragen ob sich die maus über deinem handle befindet oder nicht. der rückgabewert von WindowFromPoint ist das handle über dem sich die maus gerad befindet.

Beispiel

Code: Alles auswählen

  GetCursorPos_(Cursor.POINT)
  If WindowFromPoint_(Cursor\x,Cursor\y)<>dein_handle
    lost
  else
    not_lost
  endif

Re: Subclassing - MouseNotOver

Verfasst: 24.10.2005 02:51
von Danilo
ts-soft hat geschrieben:Ich hab für einen Button ein Subclassing Callback erstellt, also eins, das nur die Ereignisse des Buttons erhält!!!
Wie kann ich erfahren, wann die Maus nicht mehr über den Button ist. Dieses Ereignis muß aber in dem Subclassing Callback auftreten. Also irgenwas wie #WM_LOST???? oder so ähnlich, bzw. gibts da was???
Wenn der Cursor auf den Button geschoben wird, bekommst
Du ja die Nachricht #WM_MOUSEMOVE.

Hier setzt Du nun den MouseInput mit SetCapture_(hWnd)
auf den Button. Damit sagst Du das Du weiterhin Mausnach-
richten bekommen sollst. Die bekommst Du dann auch wenn
der User den Mauszeiger wieder vom Button runter bewegt
hat, also auch außerhalb des Buttons/Gadgets.

Wenn der Cursor dann außerhalb des Buttons ist, rufst Du
ReleaseCapture_() auf. Damit gibst Du den MausInput wieder
frei, so daß wieder andere Controls die Nachrichten bekommen.

PseudoCode im Subclassing-Callback:

Code: Alles auswählen

   case #WM_MOUSEMOVE:
      If CursorPos_auf_Button
         SetCapture_(hWnd)
      Else
         ReleaseCapture_()
      EndIf

Eine andere Möglichkeit: Das Fenster/Control, welches den
MouseInput verliert, bekommt die Nachricht #WM_CAPTURECHANGED.
Das ist sozusagen Dein gesuchtes #WM_LOST....


Dritte Möglichkeit: Mit der Funktion TrackMouseEvent_() kannst
Du Windows anweisen Dir die 2 Messages #WM_MOUSEHOVER
und #WM_MOUSELEAVE zu schicken.
#WM_MOUSELEAVE wird Dir dann gesendet wenn der Cursor
die Control-Area verläßt.
Das gibt es allerdings erst ab (glaube ich) Win98/NT4, weshalb
man normal eher die obigen Methoden verwendet.
Mußt mal selbst in MSDN/PSDK schauen, ich habe das jetzt
nicht genau im Kopf ab wann es das genau gab.


Hope it helps.

Verfasst: 24.10.2005 09:01
von ts-soft
:allright: , konnte dank Euch gelöst werden, bzw. Nikolaus sein Vorschlag, sah in etwa wie meine Versuche aus, aber Danilos Tip wahr wieder ausschlaggebend für die Lösung:

Code: Alles auswählen

    ElseIf Msg = #WM_MOUSEMOVE
      GetCursorPos_(pt.POINT)
      GetWindowRect_(hWnd,re.RECT)
      If PtInRect_(re,pt\x,pt\y)
        SetCapture_(hWnd)
        Debug "MouseOver"
      Else
        ReleaseCapture_()
        Debug "Out"
      EndIf
So sieht der entsprechend umgesetzte Testcode aus und funktioniert :D

SetCapture_() hab ich ja bisher nur für Fenster genommen, das dies auch bei Childs funzt, daran hab ich nicht gedacht, ich *Dummkopf*