OptionGadget per Tastatur

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

OptionGadget per Tastatur

Beitrag von uweb »

Hallo,
bei z.B. mehreren CheckboxGadgets kann der Anwender die doch per Tabulatur ansteuern und per Leertaste auswählen. Das gleiche bekomme ich mit OptionGadgets (z.B. das Beispiel aus der Hilfe) nicht hin.
Gibt es da einen Trick ?
Benutzeravatar
Hartmut
Beiträge: 56
Registriert: 15.09.2006 22:22
Kontaktdaten:

Beitrag von Hartmut »

Hallo,

was meinst du genau mit OptionGadgets ?
In einer Combobox kann man z.B. mit Cursor (rauf und runter) zwischen den Werten wechseln.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> was meinst du genau mit OptionGadgets ?

na, halt OptionGadgets eben ;-)

In anderen Sprachen heißen die u.a. RadioButtons.

> Combobox kann man z.B. mit Cursor (rauf und runter) zwischen den
> Werten wechseln.

Code: Alles auswählen

ComboBoxGadgets != OptionGadgets
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Ich habe es für den Moment mit AddKeyboardShurtcut gelöst.
So reagiere ich auf die Up- bzw Down-Taste und wechsle entsprechend das aktive Gadget wenn es eines der betroffenen OptionGadgets ist.
Irgendwie habe ich aber das Gefühl, das ist nicht der optimale Weg.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das Problem liegt AFAIK bei den Flags ws_group und ws_tabstop.
Ob es da Abhilfe gibt weiss ich allerdings nicht , da muesstest du
warten bis jemand eine Lösung postet oder mal Google fragen.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Danke fuer nichts.
stimmt nicht ganz. Nun weiß ich immerhin, daß ich mich vorläufig damit nicht weiter beschäftigen brauche.
Eine Notlösung habe ich ja.
Also doch : DANKE !
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ich habe es für den Moment mit AddKeyboardShurtcut gelöst.
So reagiere ich auf die Up- bzw Down-Taste und wechsle entsprechend das aktive Gadget wenn es eines der betroffenen OptionGadgets ist.
Irgendwie habe ich aber das Gefühl, das ist nicht der optimale Weg.
Soweit ich weiss ist dieses Problem mit dem jetzigen Stand von PB unlösbar.

Ein kleiner Exkurs:

Die Funktionalität auf du hier anspielst nennt sich "Dialog Box Keyboard Interface" welches es einem erlaubt die Controls und das Fenster selber mittels der Tastatur zu kontrollieren. Wie man es von "handelsüblichen" Windows-basierten Anwedungen kennt.

Eine komplette Liste aller verwendeten Tasten, Tastenkombination sowie ausführliche Details findest du hier:

http://msdn2.microsoft.com/en-us/librar ... oard_iface

Wie der Name schon sagt ist dieses Verhalten eigentlich nur Dialogen vorbehalten aber mit dem Befehl IsDialogMessage_() ist es möglich dieses auch für reguläre Fenster zu aktivieren. Allerdings hat das einen kleinen Nachteil weil das normale Eingabeverhalten ein wenig beeinträchtigt wird (wie genau steht auf MSDN).

Der eigentliche Knackpunkt ist folgender:

Der Befehl IsDialogMessage_() verlangt einen Pointer zu einer MSG Structure welche alle Nachrichten-spezifischen Informationen eines Threads enthält. Also genau wie die Nachrichten die man mittels eines Callbacks abfängt. Mit reiner WinAPI würde das so ausehen:

Code: Alles auswählen

lpMsg.MSG

While GetMessage_(lpMsg,0,0,0)
    If IsDialogMessage_(result,lpMsg) = 0
        TranslateMessage_(lpMsg)
        DispatchMessage_(lpMsg)        
    EndIf
Wend
Und so das Gegenstück mit nativen PB Befehlen:

Code: Alles auswählen

Repeat
	EventID = WaitWindowEvent()

Until EventID = #PB_Event_CloseWindow
Das Behandlen von TranslateMessage_() und DispatchMessage_() würde in diesem Fall WaitWindowEvent() übernemen. Allerdings selbst wenn es mir gelingen würde PB's internen Message-Queue in Echtzeit abzufangen und zu bearbeiten (was mir selbst mit diversen WindowHooks nur bedingt gelungen ist) und den Pointer zur MSG Structure bekommen, müsste ich immer noch einen IF/ENDIF Block hinzufügen und das ist absolut unmöglich. Dazu müsste man PB's Quellcode modfizieren.
Antworten