Forum: PC-Programmierung Winapi Tabtaste


von Holger74 (Gast)


Lesenswert?

Hallo,

normalerweise erstelle ich meine Programme mit C++ und dem .net 
framework.
Zur Abwechslung sollte es für eine kleine Anwendung diesmal C und winapi 
sein. Drei Button und ein Editfeld hab ich schon.

Jetzt finde ich nichts darüber, wie man mit der Tabtaste vom einem zum 
nächsten Steuerelement springen kann.

Kann mir jemand helfen?

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

>Jetzt finde ich nichts darüber, wie man mit der Tabtaste vom einem zum
>nächsten Steuerelement springen kann.
Ich glaube, das geschieht automatisch... Probiers mal aus. So wie ich 
das noch im Kopf habe, geht der von sich aus ins nächste Feld und die 
"Erkennung", welches Feld es ist, läuft dann am Ende der Eingabe über 
den Callback-Handler des jeweiligen Feldes.

von Holger74 (Gast)


Lesenswert?

Das geht leider nicht automatisch.
Sind die Steuerelemente überhaupt untereinanander verbunden, bei der 
winapi?

von MaWin (Gast)


Lesenswert?

> Drei Button und ein Editfeld hab ich schon.
> Jetzt finde ich nichts darüber, wie man mit der Tabtaste
> vom einem zum nächsten Steuerelement springen kann.

Hast du sie in einem Dialogklassenfenster (DialogBox, CreateDialog, 
DlgProc, WC_DIALOG, #32770) angelegt (dort wird die TAB-Taste über die 
DefDlgProc Messages WM_NEXTDLGCTL bzw. Funktion GetNextDlgTabItem 
gehandelt)

oder hast du ein normales Fenster (CreateWindow) angelegt und deine 
Buttons als Childs mit CreateWindow(...hWndMain...) eingebunden, dann 
hast du kein TAB Handling. Da du Standard-Windows-Controls verwendest, 
solltest du dann auf einen TAB-Tastendruck Event selbst herausfinden, 
welches dein nächstes Feld ist, oder mal ausprobieren, ob deine 
Anordnung so ist, daß DefDlgProc sie unter deinen Bedingungen umsetzen 
kann.

von Mark .. (mork)


Lesenswert?

Man kann auch bei normalen Fenstern mit Tabs zwischen den 
Kontrollelementen navigieren.

Dazu muss WS_TABSTOP als Windowstyle mit angegeben werden, wenn man die 
Elemente erzeugt. Außerdem müssen die Nachrichten in der Hauptschleife 
durch IsDialogMessage() anstatt TranslateMessage() und DispatchMessage() 
ausgewertet werden.

MfG Mark

von Holger74 (Gast)


Lesenswert?

Ja, es ist ein ganz normales Fenster und die Elemente sind auch mit 
CreateWindow angelegt.
Das heißt man muss das Springen mit der TabTaste von Hand erledigen?

von Holger74 (Gast)


Lesenswert?

WS_TABSTOP & IsDialogMessage() funktioniert, Mark.

Das Fenster sieht jetzt so aus:

BUTTON1     TEXTEDIT
BUTTON2
BUTTON3

Und der Focus springt von Button1 zum TextEdit zum Button2 zum TextEdit 
zu Button3.

Wie kann man die Reihenfolge festlegen?

von Win32 (Gast)


Lesenswert?

Holger74 schrieb:
> Wie kann man die Reihenfolge festlegen?

z.B. durch die Reichenfolge der Erstellung - dann ist aber (wenn Du es 
nicht ausschließt) das letzte Steuerelement das erste.

Auch "SetWindowPos" - man beachte "Z order" (ist aber bei .NET auch so)

von Holger74 (Gast)


Lesenswert?

Vielen Dank, win32. Läuft:) Vielen Dank auch an alle anderen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.