001
06.11.2002, 13:01 Uhr
Volle
|
Hallo Ektoplasma,
mein erster Beitrag von heute Morgen war Mist. Deshalb habe ich ihn gelöscht. Ich habe deine Frage völlig missverstanden...
Ich habe mal ein Projekt erstellt, das einen Dialog erzeugt, ähnlich den Bildschirmeinstellungen von Windows. Ich gehe dabei einen etwas anderen Weg als in dem Beispiel auf der Seite hier. Aber dafür fällt die SetRec()- Funktion weg. Wenn Du willst schicke ich Dir das ganze Projekt.
Ansonsten hier ein Erklärungsversuch:
Zuerst mal muss man im aktuellen Projekt eine neue Klasse einfügen und diese von der Basisklasse CPropertySheet ableiten (Bsp.: CPSheet). Dann erstellt man sich im Resourcen- Editor die Dialogresourcen für die einzelnen Pages, die man im Tab- Dialog anzeigen lassen möchte. Anschließend erzeugt man auf Grundlage der neu angelegten Resourcen zwei neue Klassen (Doppelklick auf Resource) und leitet diese von CPropertyPage ab (Bsp.: CPPage1 und CPPage2). Jetzt legt man in der Sheetklasse CPSheet zwei Members für die beiden Pages CPPage1 und CPPage2 an.
| C++: |
private: CPPage1* page1; CPPage2* page2;
|
Dann muss man im Konstruktor der Sheetklasse dafür sorgen, dass die beiden (oder mehr) Pages auch geladen werden.
| C++: |
CTabSheet::CTabSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { page1 = new CPPage1; page2 = new CPPage2; AddPage(page1); AddPage(page2); }
CTabSheet::CTabSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { page1 = new CPPage1; page2 = new CPPage2; AddPage(page1); AddPage(page2); }
CTabSheet::~CTabSheet() { delete page1; delete page2; }
|
Da man mit Pointern arbeiten muss (Adressoperator & führt in diesem Fall zum Absturz soweit ich weiß.), sollte man das Freigeben des Speichers im Destruktor nicht vergessen. Außerdem verwendet CPropertySheet einen überladenen Kontsruktor. Daher sollte man den Code in beiden Konstruktoren angeben (Das kann man natürlich auch in eine eigene Funktion auslagern).
Und damit hat sich die Sache dann auch schon erledigt. Wenn man es so macht, dann werden die Seiten sofort richtig angezeigt.
Zusatzinfo:
Wenn man das ganze auf Basis einer dialogfeldbasierenden Anwendung (Wizard) machen will, muss man sich einen kleinen Workaraund geben:
Zuerst mal die Anwendung ganz normal (dialogfeldbasierend) erstellen. Dann, wie oben beschrieben, die Sheet- und Pageklassen erzeugen.
Danach muss man in der InitInstance der App- Klasse folgende Änderung durchführen:
| C++: |
CTabSheet dlg("Titel"); //an dieser Stelle eigene Sheetklasse angeben m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) {
|
Dabei die Includes nicht vergessen zu ändern! Danach hat die vom Wizard erstellte Dialogklasse ausgedient und kann gelöscht werden.
Alles klar?
Wenn nicht, frag nach.
Gruß, Volle. |