TabControl erzeugen
-
Ich möchte mir ein TabControl mit 3 Blättern anlegen.
Nachdem ich das Steuerelement platziert habe
und es die Variable CTabCtrl m_TabCtrl; bekommen
hat:m_TabCtrl.InsertItem(1, "Blatt1"); m_TabCtrl.InsertItem(2, "Blatt2"); m_TabCtrl.InsertItem(3, "Blatt3");
Habe ich nun keine Idee wie ich den Inhalt
gestalten kann.Soweit ich gelesen habe, muss ich 3 Dialog erstellen
(für jedes Blatt einen). Dann jedem Dialog eine Klasse
zuordnen, die ich von CPropertyPage ableite.
Die Header in meiner Dlh.h includen...Aber dann verlassen sie mich
Wie weise ich die Dialoge zu ?
-
Es geht auch ohne CPropertysheet.
Schau dir mal meine Klasse DynTabCtrl
an, du musst dann einfach nur die Dialoge erstellen, und statt CTabCtrl
DynTabCtrl nehmen, und per Insert(CDialog*,CString titel, UINT ID) einfügen.Devil
-
Hallo devil81,
als Anfänger mach ich es mir noch etwas schwer mit
Dateien die ich in mein Projekt aufnehme.
Ich habe zwar deine beiden Dateien aufgenommen und
auch die .h im include. Aber wie ich das jetzt mit
meinen 2 Dialogen verknüpfe ?Die 2 Dialoge sind von CPropertyPage abgeleitet.
Ist das richtig ? Ich erstelle nun also eine
Variable CDynTabCtrl m_tabvar;Und dann geht es mit m_tabvbar.InsertItem(?) weiter ?
Sorry wie du siehst verstehe ich es nicht
Ich habe zwar eine Registerkarte anlegen können, durch einen
anderen Beitrag den ich gelesen habe, aber grundsätzlich würde
ich gerne deine Version verstehen und anwenden können!
-
OK, dann schreib ich mal ne kleine Anleitung:
1. TabCtrl auf dialog setzen.
2. Klasse DynTabCtrl in Projekt einbinden.
3. Membervariable auf TabCtrl erstellen (entweder direkt DynTabCtrl, oder CTabCtrl und danach im Header mit DynTabCtrl ersetzen)
4. Mach dir ein paar dialog, welche in den eigenschaften Untergeordnet und randlos sind.
5. Die Dialogklassen von CDialog ableiten
6. Den Header der Tab-Dialoge in die Datei des Hauptdialog einbinden(Da wo die TabCtrl ist).
7. m_dynTabCtrl.InsertItem(new myDialog(), "Lustiger Titel", IDD_DIALOG1) aufrufen,
um eine Tab hinzuzufügen.Devil
-
Hallo devil81,
gute Erklärung und prima Klasse. Thx
Mit m_dynTabCtrl.InsertItem( new dialogklasse1,"Frohe Weihnacht", IDD_DIALOG1);
kann ich nun endlich wo ich will mein TabCtrl platzieren.
Das sollte wirklich in die FAQ, weil schon so viele danach gesucht haben.Mit deiner Erlärung geht es nun bestens
-
Finde ich auch eine sehr gute Beschreibung. Hab's auch sofort hinbekommen.
Ich frage mich nur, wie ich aus dem Hauptdialog" auf die einzelnen Elemente der Karteireiter zugreifen kann... Also beispielsweise den text eines Edit Feldes ändern und so.
Kann mir das bitte wer erklären?
Wenn ich es so versuche, stürzt mein Programm ab...
m_ctlProperty.GetTab(0)->SetDlgItemtext(IDC_TEXT, "Hallo");
Danke im Voraus.
-
Hm, eigentlich gehört das dann in die Dialogklasse von dem
jeweiligen Tab...
Ansonsten liefert GetTab nur einen Zeiger auf CDialog zurück,
du Müsstest also evtl. noch auf deine spezielle Klasse casten.Devil
-
devil81 schrieb:
Ansonsten liefert GetTab nur einen Zeiger auf CDialog zurück,
du Müsstest also evtl. noch auf deine spezielle Klasse casten.Ich hab ehrlich gesagt keine Ahnung, was du damit meinst.
Das Problem ist folgendes:
Ich habe mehrere Kerteireiter auf denen verschiedene Einstellungmöglichkeiten zu machen sind (zu jeder Kategorie ein Tab). Nun nöchte ich alle Einstellungen mit einem Button auf dem Hauptdialog speichern.
Ich probiere schon die ganze Zeit es hinzubekommen, leider ohne Erfolg...
P.S.: Ich hatte eine Email an dich geschrieben. Hab nicht gecheckt, dass du die Klasse geschrieben hast.
Da hab ich auch ein paar Zeilen korrigiert.
-
Ellek schrieb:
devil81 schrieb:
Ansonsten liefert GetTab nur einen Zeiger auf CDialog zurück,
du Müsstest also evtl. noch auf deine spezielle Klasse casten.Ich hab ehrlich gesagt keine Ahnung, was du damit meinst.
Das Problem ist folgendes:
Ich habe mehrere Kerteireiter auf denen verschiedene Einstellungmöglichkeiten zu machen sind (zu jeder Kategorie ein Tab). Nun nöchte ich alle Einstellungen mit einem Button auf dem Hauptdialog speichern.
Die Informationen etc. über die Steuerelemente liegen ja in den Instanzen deiner Klassen.
DynTabCtrl speichert aber nur CDialog* Pointer, da die Klasse ja alle Dialoge darstellen
soll, und nicht nur die eines typs, d.h. du musst dann den Pointer noch
in die richtige Klasse casten. Dafür musst du wissen, welche Klasse auf welchem
Tab liegt.((CMyDlg*)m_tabctrl.GetTab(0))->*zugriff auf membervars oder funktionen*
Devil
-
Hallo,
Ich habe auch mal deine Klasse zum testen verwendet, allerdings musste ich das hier ändern, damit ich Zugriff auf die einzelnen Tab-Dialoge hatte:
Aus
CDialog* DynTabCtrl::GetTab(int itab) { if(m_tabs.size() < itab && itab > -1) return m_tabs[itab]; return NULL; }
muss
CDialog* DynTabCtrl::GetTab(int itab) { if(m_tabs.size() > itab && itab > -1) return m_tabs[itab]; return NULL; }
werden, sonst bekommt man immer NULL anstatt des Pointers auf einen Dialog zurückgeliefert (die Nummer des Tab-Dialogs kann nicht größer als die größe des Vektors sein
)
nur so als Anmerkung...
-
Danke für den Fehlerhinweis, war mir garnicht aufgefallen...
Ich hab die Klasse nochmals überarbeitet, es ist jetzt möglich
die einzelnen Tabs zu löschen, entweder ein beliebiges Tab,
oder nur das was gerade den Focus hat. Standardmässig ist
das jedoch abgeschaltet, mann muss es entweder im Konstruktor
aktivieren, oder DynTabCtrl::SetDeleteTab(true) aufrufen.Devil
-
Also eine gaaanz dumme frage:
wie kann ich machen, dass, wenn ich einen button drücke, ein tab entfernt wird?!
bitte genauste anleitung, da noob am werk
-
Du must nur die Nummer des Tabs welches du löschen willst wissen,
und dann einfach DeleteItem(nummer) aufrufen.In der Neusten Version ist es aber auch so implementiert
das man sie über Rechtsklick schliessen kann. Schaus dir einfach an.Devil
-
Und was mache ich, wenn ich bereits einen kompletten Dialog fertig habe und diesen nun in eine Registerkarte einfügen möchte? Sprich: Wie bekomme ich all´ die Ressourcen in das neue Projekt, so dass auch alle Funktionen noch einwandfrei laufen?
Gruß,
Holger
-
Den Dialog müsstest du importieren können, oder Copy & Paste müsste auch funktionieren,
wenn du beide Projekte offen hast.
Dann musst du noch die entsprechenden Dateien für die Dialogklasse dem Projekt hinzufügen.Der Dialog muss dann noch in den Resourcen so eingestellt sein, das er keinen Rand
hat, und untergeordnet ist.Devil
-
Hallo devil81!
Ich habe eine frage zu deinem Anleitung!
Zu punkt 3: In welcher Klasse muss ich die Membervariable erstellen?
-
Im Dialog wo das TabCtrl liegt.
-
Hallo zusammen,
finde die Klasse auch ganz praktisch!
Nur leider stehe ich an:
Ich möchte die Tabs vom Programm her ansteuern. Das heisst soviel wie, ich befinde mich gerade in einem Tab und möchte beim anklicken eines bestimmten Buttons direkt in ein anderes Tab wechseln...
hab bisher leider nichts rausbekommen, bin für gute Ratschläge offen.
Gruss
-
Da ist mir gerade noch was aufgefallen:
Wenn man mit den Pfeiltasten die Tabs auswählt, wechselt der Dialog nicht...
-
aCCa schrieb:
Da ist mir gerade noch was aufgefallen:
Wenn man mit den Pfeiltasten die Tabs auswählt, wechselt der Dialog nicht...
Würde mich auch interessieren wie man den Dialog-Wechsel durch die Pfeiltasten realisiert