Subclassing - MouseNotOver

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Subclassing - MouseNotOver

Beitrag 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???
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Subclassing - MouseNotOver

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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*
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten