Kann man den Status einer Maustaste fetsstellen ?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Pope
Cut&Paste-Entwickler
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 ?

Beitrag von Pope »

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
Benutzeravatar
AUGE_OHR
Marvin
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 ?

Beitrag von AUGE_OHR »

hi,
Pope 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.
das ist ein "normales" Verhalten, jedoch frag ich mich wie und wo du
deine Events abfragst ? verwendest du :captureMouse() um deine Mouse
Events abzufangen ?

gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Klaus,

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
Benutzeravatar
Pope
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Mi, 08. Feb 2006 22:00
Wohnort: bei Karlsruhe (D)
Kontaktdaten:

Noch kein Land in Sicht

Beitrag von Pope »

@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
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

hi,
Pope hat geschrieben: Mit :captureMouse() alles auf ein xBasePart umzulenken wird wohl hierbei
auch wenig bringen - oder ?
es muss hier im Forum irgendwo eine Thread mit SKIN und Titlebar geben.
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
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Klaus,

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
Benutzeravatar
Pope
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Mi, 08. Feb 2006 22:00
Wohnort: bei Karlsruhe (D)
Kontaktdaten:

Juchuuuu !!

Beitrag von Pope »

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
Antworten