PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] TabControl und Tabulator-Reihenfolge


Dr.Doom
2016-08-12, 12:09:39
Howdy,

ich habe einen Hauptdialog in dem ein TabControl eingebettet ist, welches je einen Unterdialog als Inhalt auf den Tabs anzeigt.

Alles in C dem Muster folgend:

TC_ITEM tci;
hTabControl = GetDlgItem (hDlg, ID_MYTABCONTROL); // TabControl in Hauptdialog
tci.mask = TCIF_TEXT;
tci.iImage = -1;
tci.pszText = "mytab1";
TabCtrl_InsertItem (hTabControl, 0, &tci);
...
// dasselbe für "mytab2" nochmal
...
hTabs[0] = CreateDialog (hInst, "DLG_TAB_MYTAB1", hTabControl, Proc_MyTab1); // Unterdialoge
hTabs[1] = CreateDialog (hInst, "DLG_TAB_MYTAB2", hTabControl, Proc_MyTab2); // "Proc_xyz" = Callback für Message-Behandlung
...


Für jeden Dialog, Unterdialoge des TabControls und umgebender Hauptdialog, der neben anderen Controls (Button, TextEdit, etc) das TabControl beherbergt, ist die "Aktivierungsreihenfolge" festgelegt worden.

Solange man noch im Ressourceneditor ist und man die einzelnen Dialoge testet ("Testdialogfeld"), funktioniert die Weiterschaltung wie sie soll -- aber halt nur für jeden Dialog separat betrachtet.
Wenn man das Ganze aber übersetzt (debug/release, egal) und ausführt, dann springt der Focus beim Druck auf Tab immer aus einem Unterdialog auf ein Control des Hauptdialogs.

Muss ich den Tab-Tastendruck abfangen, nachsehen, ob gerade ein Control auf einem der TabControl-Unterdialoge den Focus hat und den Focus selber zum nächsten Control versetzten? Oder die Message an einen der Unterdialoge weiterreichen?
Oder...?!
Mir ist nicht klar, wo ich den Schraubenziehen ansetzen muss, um durch Tab-Drücken im Unterdialog zu bleiben und dort immer zum nächsten Control weiterzuschalten.

ManuelCalavera
2016-08-16, 11:44:56
Eventuell hilft es den Extended Style WS_EX_CONTROLPARENT auf dem TabCtrl zu setzen:

https://msdn.microsoft.com/de-de/library/windows/desktop/ff700543(v=vs.85).aspx

Dr.Doom
2016-08-16, 15:05:15
Danke, das Stichwort war der erste Schritt.
Zusätzlich war noch das ParentWindow der Unterdialoge falsch gesetzt - Parent der Unterdialoge muss der Hauptdialog sein (in dem das TabControl liegt), nicht das TabControl selber.

Folgeproblem ist nun, dass die Unterdialoge nun falsch positioniert sind. Mit GetClientRect konnte ich mir den Ursprung vom TabControl holen und die Unterdialoge dahinmoven.
Jetzt sind die Unterdialoge aber keine Kinder vom TabControl mehr, sondern vom Hauptdialog -- die Unterdialoge müssen aber dennoch wieder bündig ins TabControl bewegt werden... ich vermute mal, dass jetzt die Stelle mit dem Umrechnen von Dialogeinheiten in Pixel kommt, oder etwas in der Richtung...
War ja einfach und nicht problematisch. :cool: