Kann man den Status einer Maustaste fetsstellen ?
Moderator: Moderatoren
- Pope
- Cut&Paste-Entwickler
- Beiträge: 40
- Registriert: Mi, 08. Feb 2006 22:00
- Wohnort: bei Karlsruhe (D)
- Kontaktdaten:
Kann man den Status einer Maustaste fetsstellen ?
Hallo,
weiß jemand von Euch ob man den "gedrückt oder nicht gedrückt"-Status einer Maus im Eventhandler abfragen kann ??
Ich meine NICHT den Event LbDown oder LbUp, sondern den tatsächlichen ZUSTAND im Moment der Abfrage.
Hintergrund ist, daß bei meinen selbstprogrammierten Drag&Drop-Browses sehr oft Events "verlorengehen" - d.h. bei schneller Folge von "Maus drücken" -> "Maus ziehen" -> "Maustaste loslassen" bleibt oft (vor allem bei langsamen Rechnern oder schnellen Usern ) der Zustand des "gezogenen Elements" bestehen obwohl längst die Maustaste wieder losgelassen wurde.
Ideal wäre also beim nächsten Event (z.B. weitere Bewegung) den Zustand der Maustaste zur Sicherheit abzuprüfen - ähnlich der Abfrage der Numlock-Taste mit AppKeyState(). Gints sowas für Maustasten ????
Danke
Klaus "Pope" Bischoff
weiß jemand von Euch ob man den "gedrückt oder nicht gedrückt"-Status einer Maus im Eventhandler abfragen kann ??
Ich meine NICHT den Event LbDown oder LbUp, sondern den tatsächlichen ZUSTAND im Moment der Abfrage.
Hintergrund ist, daß bei meinen selbstprogrammierten Drag&Drop-Browses sehr oft Events "verlorengehen" - d.h. bei schneller Folge von "Maus drücken" -> "Maus ziehen" -> "Maustaste loslassen" bleibt oft (vor allem bei langsamen Rechnern oder schnellen Usern ) der Zustand des "gezogenen Elements" bestehen obwohl längst die Maustaste wieder losgelassen wurde.
Ideal wäre also beim nächsten Event (z.B. weitere Bewegung) den Zustand der Maustaste zur Sicherheit abzuprüfen - ähnlich der Abfrage der Numlock-Taste mit AppKeyState(). Gints sowas für Maustasten ????
Danke
Klaus "Pope" Bischoff
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Kann man den Status einer Maustaste fetsstellen ?
hi,
deine Events abfragst ? verwendest du :captureMouse() um deine Mouse
Events abzufangen ?
gruss by OHR
Jimmy
das ist ein "normales" Verhalten, jedoch frag ich mich wie und wo duPope hat geschrieben: weiß jemand von Euch ob man den "gedrückt oder nicht gedrückt"-Status einer Maus im Eventhandler abfragen kann ??
Ich meine NICHT den Event LbDown oder LbUp, sondern den tatsächlichen ZUSTAND im Moment der Abfrage.
Hintergrund ist, daß bei meinen selbstprogrammierten Drag&Drop-Browses sehr oft Events "verlorengehen" - d.h. bei schneller Folge von "Maus drücken" -> "Maus ziehen" -> "Maustaste loslassen" bleibt oft (vor allem bei langsamen Rechnern oder schnellen Usern ) der Zustand des "gezogenen Elements" bestehen obwohl längst die Maustaste wieder losgelassen wurde.
deine Events abfragst ? verwendest du :captureMouse() um deine Mouse
Events abzufangen ?
gruss by OHR
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo Klaus,
das müsste es tun.
Viele Grüße,
Günter
das müsste es tun.
Viele Grüße,
Günter
Code: Alles auswählen
#define VK_LBUTTON 1 // links
#define VK_RBUTTON 2 // rechts
#define VK_MBUTTON 4 // Mitte
#define VK_XBUTTON1 5 // Windows 2000/XP: X1-Button
#define VK_XBUTTON2 6 // Windows 2000/XP: X2-Button
FUNCTION IsKeyPressed( nKey )
LOCAL nState := GetAsyncKeyState( nKey )
RETURN nState[32]
DLLFUNCTION GetAsyncKeyState( nVirtualKey ) ;
USING STDCALL FROM user32.dll
- Pope
- Cut&Paste-Entwickler
- Beiträge: 40
- Registriert: Mi, 08. Feb 2006 22:00
- Wohnort: bei Karlsruhe (D)
- Kontaktdaten:
Noch kein Land in Sicht
@Jimmy:
Ich nutze xBase 1.9 mit eXPress - und im eXPress-Handler des Dialogs (DCREAD GUI HANDLER xy) werte ich alle Events aus. Dort prüfe ich wie im "reinen" xBase-Code auf Events wie xbeM_LbDown, xbeM_LbUp oder xbeM_Motion ab.
das funktioniert ja auch - aber bei schneller Folge scheint auch mal was "unterzugehen". Mit :captureMouse() alles auf ein xBasePart umzulenken wird wohl hierbei auch wenig bringen - oder ?
@Günter:
Danke für die schnelle Antwort - leider gibt die von Dir vorgeschlagene Lösung bei Abfrage von IsKeyPressed(1) aber auch nur EINMAL True zurück, bei weiteren Bewegungen der Maus trotz weiterhin gedrückter Taste aber dann FALSE Schade
Gruß
Klaus "Pope" Bischoff
Ich nutze xBase 1.9 mit eXPress - und im eXPress-Handler des Dialogs (DCREAD GUI HANDLER xy) werte ich alle Events aus. Dort prüfe ich wie im "reinen" xBase-Code auf Events wie xbeM_LbDown, xbeM_LbUp oder xbeM_Motion ab.
das funktioniert ja auch - aber bei schneller Folge scheint auch mal was "unterzugehen". Mit :captureMouse() alles auf ein xBasePart umzulenken wird wohl hierbei auch wenig bringen - oder ?
@Günter:
Danke für die schnelle Antwort - leider gibt die von Dir vorgeschlagene Lösung bei Abfrage von IsKeyPressed(1) aber auch nur EINMAL True zurück, bei weiteren Bewegungen der Maus trotz weiterhin gedrückter Taste aber dann FALSE Schade
Gruß
Klaus "Pope" Bischoff
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Noch kein Land in Sicht
hi,
da der Titlebar ja mit einem "eigenen" überschrieben wurde sodas man
nicht mehr den original hatte um den Dialog zu verschieben (click auf
Titlebar und dann moven). Also musste ich anfangen den LbDown und
LbUp Event abfangen um Anfang/Ende des :move Vorgang zu kontrolieren.
Schon sehr bald hab ich bemerkt das ohne :captureMouse() nicht läuft
weil ja jedes LbDown/LbUp den Event erzeugt ich aber nur den vom
Titlebar haben will.
Das er sich den "Status" nicht von alleine merkt ist doch wohl klar und
das muss man eben in seiner Class abfangen wenn das "richtige"
LbDown bzw LbUp kommt.
gruss by OHR
Jimmy
es muss hier im Forum irgendwo eine Thread mit SKIN und Titlebar geben.Pope hat geschrieben: Mit :captureMouse() alles auf ein xBasePart umzulenken wird wohl hierbei
auch wenig bringen - oder ?
da der Titlebar ja mit einem "eigenen" überschrieben wurde sodas man
nicht mehr den original hatte um den Dialog zu verschieben (click auf
Titlebar und dann moven). Also musste ich anfangen den LbDown und
LbUp Event abfangen um Anfang/Ende des :move Vorgang zu kontrolieren.
Schon sehr bald hab ich bemerkt das ohne :captureMouse() nicht läuft
weil ja jedes LbDown/LbUp den Event erzeugt ich aber nur den vom
Titlebar haben will.
Das er sich den "Status" nicht von alleine merkt ist doch wohl klar und
das muss man eben in seiner Class abfangen wenn das "richtige"
LbDown bzw LbUp kommt.
gruss by OHR
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo Klaus,
habe noch mal nachgeschaut und das Problem gefunden... Bit 16 ist das "gedrückt"-Flag, nicht Bit 32.
habe noch mal nachgeschaut und das Problem gefunden... Bit 16 ist das "gedrückt"-Flag, nicht Bit 32.
Code: Alles auswählen
#define VK_LBUTTON 1 // links
#define VK_RBUTTON 2 // rechts
#define VK_MBUTTON 4 // Mitte
#define VK_XBUTTON1 5 // Windows 2000/XP: X1-Button
#define VK_XBUTTON2 6 // Windows 2000/XP: X2-Button
FUNCTION IsKeyPressed( nKey )
LOCAL nState := GetAsyncKeyState( nKey )
RETURN nState[16] // oder bAnd( nState, 0x8000) > 0
// statt nState[32]
DLLFUNCTION GetAsyncKeyState( nVirtualKey ) ;
USING STDCALL FROM user32.dll
- Pope
- Cut&Paste-Entwickler
- Beiträge: 40
- Registriert: Mi, 08. Feb 2006 22:00
- Wohnort: bei Karlsruhe (D)
- Kontaktdaten:
Juchuuuu !!
Hey Günter,
Du hast ein Bier bei mir gut
Wusst ich doch, daß da irgendwo in den Tiefen der Windows API sowas versteckt sein muß. Das kann ich jetzt an tausend Stellen im Programm gut verwenden. Ich verstehe gar nicht, daß eine so wichtige Information nicht über den normalen Sprach-Umfang von xBase++ (oder wenigstens der xBTools) abzufragen ist.
Wenn man viel mit Maus-Events arbeitet (z.B. Drag&Drop oder Anzeige von Infofenstern bei Mouse-over-Object) dann ist diese Abfrage doch fast unerlässlich. Wenn jemand ne Maustaste drückt, dann mit gedrückter Maustaste den Bildschirmbereich meines Programms verlässt und dort außerhalb die Maustaste wieder loslässt -- wie soll ich das denn nachher noch wissen, wenn mir mein Handler das MouseUp-Event nicht meldet ?? Eben NUR mit einer ständigen Sicherheitsabfrage, ob die Maustaste denn wirklich noch gedrückt oder ungedrückt ist.
Danke - Du hast mir sehr geholfen
Gruß
Klaus "Pope" Bischoff
Du hast ein Bier bei mir gut
Wusst ich doch, daß da irgendwo in den Tiefen der Windows API sowas versteckt sein muß. Das kann ich jetzt an tausend Stellen im Programm gut verwenden. Ich verstehe gar nicht, daß eine so wichtige Information nicht über den normalen Sprach-Umfang von xBase++ (oder wenigstens der xBTools) abzufragen ist.
Wenn man viel mit Maus-Events arbeitet (z.B. Drag&Drop oder Anzeige von Infofenstern bei Mouse-over-Object) dann ist diese Abfrage doch fast unerlässlich. Wenn jemand ne Maustaste drückt, dann mit gedrückter Maustaste den Bildschirmbereich meines Programms verlässt und dort außerhalb die Maustaste wieder loslässt -- wie soll ich das denn nachher noch wissen, wenn mir mein Handler das MouseUp-Event nicht meldet ?? Eben NUR mit einer ständigen Sicherheitsabfrage, ob die Maustaste denn wirklich noch gedrückt oder ungedrückt ist.
Danke - Du hast mir sehr geholfen
Gruß
Klaus "Pope" Bischoff