Registerkarten in einem Dialog

kscha

Mitglied
Hallo Leute !

Ich habe folgendes Problem:
Ich habe bereits einen Dialog mit mehreren Elementen und Funktionen in MFC programmiert. Jetzt möchte ich gerne im Nachhinein "Registerkarten" in diesem Dialog einbauen. Die Elemente, die bereits in meinem Dialogfenster zu sehen sind, sollen auf dem ersten Registerblatt stehen; auf einem zweiten Blatt möchte ich noch weitere Elemente erstellen.

Hier jetzt meine Fragen dazu:
1. Wie kann ich definieren, wieviele Karten auftauchen sollen ?
2. Wie kann ich diese beschriften ? (über Member-Variablen )
3. Wie kann ich die bereits vorhandenen Elemente an das erste Registerblatt koppeln ?
4. Wie kann ich auf die unterschiedlichen Karten dann zugreifen ?

Ich hoffe, daß mir jemand weiterhelfen kann !

Vielen Dank schon mal

Viele Grüße,

Kai
 
Zu. 1., 2. und 4.: Setz dir im Ressourceneditor ein Tabcontrol in den Dialog. Weise dem DIng im Classwizard ein Member zu vom Typ CTabCtrl. Nenn es z.B. m_ctlTab.

In der OnInitDialog()-Methode deines DIalogs initialisiert dein Tab-Control mit ein paar Tabs:
Code:
  m_ctlTab.InsertItem( 0, "Tab1" );
  m_ctlTab.InsertItem( 1, "Tab2" );
  m_ctlTab.InsertItem( 2, "Tab3" );

Dann lass dir vom Classwizard einen Handler für die Windowsmessage TCN_SELCHANGE einbauen (OnSelchange). Der wird aufgerufen, wenn sich der gewählte Tab ändert, z.B. durch einen Userclick. Zum Testen kannst du tracen, was passiert:
Code:
void CMeinDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) 
{
  int i = m_ctlTab.GetCurSel();  
  TRACE( "Gewählter Tab: %d\n", i ); 
	
  *pResult = 0;
}

Zu 3.: Wenn du soweit bist, musst du dafür sorgen, dass bei der Selektion jedes Tabs nur die Controls zu sehen sind, die in diesen Tab hineingehören. Wenn du zum Beispiel 3 Tabs TA, TB, TC hast und auf jedem von ihnen ist ein Button zu sehen (BA auf TA, BB auf TB und BC auf TC), dann machst du Button BB und BC unsichtbar und BA sichtbar, wenn Tab TA selektiert ist und so weiter.
Controls unsichtbar und sichtbar machen geht am besten mit meinButton.ShowWindow( SW_HIDE );.
Am besten packst du diese Funktionalität des UI-Updates in eine gesonderte Funktion, die du auch am Ende der OnInitDialog() aufrufst, um den Dialog schon zu Anfang korrekt darzustellen.

Übrigens kann man das Problem mit den Tabs auch mit Sub-Dialogen innerhalb des Dialogs lösen, aber das ist relativ knifflig.

Und, ganz wichtig: Du kannst stattdessen auch direkt mir PropertyPages arbeiten. Visual C++ bietet dir über das "Einfügen von Komponenten" im Projekt-Menü an, ein "Property Sheet" mit mehreren "Tabs" in dein Projekt einzubauen. Das ist zwar etwas komplexer als die Verwendung eines CTabCtrls, macht aber die Wartung der Controls auf den Tabs übersichtlicher. Ich hatte schon gelegentlch mit Dialogen zu tun, die ca. 120 einzelne Controls in ca. 5 Tabs organisierten - das war eine ziemliche Qual mit CTabCtrl. Stell dir das mal im Ressourceneditor vor - dort sind nämlich die COntrols von allen Tabs gleichzeitig zu sehen! :eek: :)
 
Hallo

Ich konnte Deine Ausführungen eben erst ausprobieren; trotzdem vielen Dank für Deine prompte Antwort

Jetzt habe ich aber folgendes Problem:

Ich kann zwar ein TabControl in meinen Dialog einfügen und kann auch eine Windowsmessage (OnSelchange) erzeugen (das Programm läßt sich auch ohne weiteres übersetzen und starten !), aber sobald ich eine Membervariable über den Classwizard definiere, kann ich das Programm nicht mehr starten (übersetzen ist kein Problem) ! Er bringt mir die Fehlermeldung "Programm hat in KERNEL32.DLL einen Fehler verursacht. ...wird beendet"

Wodran liegt das ? Warum tritt das nur auf, sobald ich eine Member-Variable definiert habe ? Ich tue doch nichts anderes als bei meinen anderen Membern auch

Hoffentlich kann mir wieder jemand helfen :)

Viele Grüße,

Kai
 
Wodran liegt das ? Warum tritt das nur auf, sobald ich eine Member-Variable definiert habe ? Ich tue doch nichts anderes als bei meinen anderen Membern auch
Oh. Das klingt nach einem Bug, und zwar nicht in deinem Programm, sondern in Windows oder im Visual Studio.
 
Oh, das klingt aber gar nicht gut :(
Da wird mir wohl nichts anderes übrig bleiben, als Deine zweite Möglichkeit mal auszuprobieren.... zum Glück steht diese auch noch zur Verfügung :)

Ich habe auch schon mal probiert eine PropertyPage einzufügen.... ist wirklich etwas komplexer !
Eine Frage zu stellen, die z.B. so lauten könnte "Erklär mir mal, wie das funktioniert", wäre wohl etwas dreist. Denn das würde bestimmt den Rahmen hier sprengen
Deshalb einfach mal lieber ganz kurze konkrete Fragen:

- Wo muß es implementiert werden (MyPropertySheet ? MyPropertyPage ?), daß im Dialog zwei Tabs dargestellt werden ?
- Wie kann ich die bereits vorhandenen Elemente darauf einbinden (auf dem ersten Tab)?
- Wie kann ich neue Elemente auf dem zweiten Tab einfügen ?

Ich gehe mal davon aus, wenn ich den Einstieg erstmal geschafft habe, daß ich dann erstmal weiter komme, ohne Dich gleich wieder zu nerven :-(

Schon mal Danke im Voraus ! :)

Gruß, Kai

P.S.: Vielleicht ist es auch besser so, denn eine Oberfläche mit 120 Elementen gleichzeitig zu verwalten stelle ich mir auch schrecklich vor
 
Ich habe auch schon mal probiert eine PropertyPage einzufügen.... ist wirklich etwas komplexer !
Eine Frage zu stellen, die z.B. so lauten könnte "Erklär mir mal, wie das funktioniert", wäre wohl etwas dreist. Denn das würde bestimmt den Rahmen hier sprengen
Du kannst dir das zum Ansehen ganz einfach vom Assistenten einbauen lassen. Im Menü wähle Projekt/Zufügen/Komponenten und.../ und dann im Dialog auswählen "Visual C++ Komponenten/Property Sheet". Das fügt dir einen getabbten Dialog (modal oder auch nicht) ins Projekt ein und du kannst dir das in Ruhe ansehen.

P.S.: Vielleicht ist es auch besser so, denn eine Oberfläche mit 120 Elementen gleichzeitig zu verwalten stelle ich mir auch schrecklich vor
Allerdings. :)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück