Forum: PC-Programmierung Wxwidget MDI ähnliche Anwendung


von Sven W. (woehlb)


Lesenswert?

Unter Windows ist es ja üblich, MDI-Anwendungen zu schreiben. Wenn diese 
dann nach Linux portiert werden, wird die MDI-Anwendung aber sowieso 
durch Notebooks nachgebildet. Deshalb möchte ich meine Anwendung von 
vornherein mit Hilfe der AUINotebooks als Childwindows realisieren.

Für die Entwicklung nutze ich den wxFormbuilder. Hauptfenster ist ein 
wxFrame. Um jetzt im Childbereich ein AUINotebook erzeugen zu können, 
wird als erstes ein Panel benutzt. Dann folgt ein Sizer und danach dann 
das AUINotebook. Die einzelnen Seiten des Notebooks werde mit wxPanel 
realisiert.

Wenn die Anwendung startet sollen die wxPanel aber noch nicht sichtbar 
sein! Wenn ich diese aber unter dem wxFormbuilder erstelle, werden diese 
angezeigt, wenn das Panel angezeigt wird.

Wie kann ich die Seiten des Notebooks unter dem wxFormbuilder erstellen, 
ohne das diese beim Start der Anwendung angezeigt werden? Das soll erst 
der Fall sein, wenn zum Beispiel eine Datei geöffnet wird.

von Sven W. (woehlb)


Lesenswert?

Eine Möglichkeit habe ich gefunden. Man könnte die einmal definierten 
wxPanels im Konstruktor des Panels löschen.

int i

i = this->m_auinotebook4->GetPageIndex(this->m_panel0);
this->m_auinotebook4->DeletePage(i);

i = this->m_auinotebook4->GetPageIndex(this->m_panel1);
this->m_auinotebook4->DeletePage(i);

...

Gibt es eine elegantere Methode?

von Mar V. (marvol)


Lesenswert?

Die Notebooks sind doch abgeleitet von wxWindows, und diese können doch 
sichtbar und unsichtbar geschaltet werden mit "hide" und "show". Ich 
kenne den wxFormbuilder nicht, aber vielleicht kannst Du dort die 
Eigenschaft "hide" auswählen für Dein Notebook, und wenn Du dann eine 
Aktion ausführst, schaltest Du auf "show"...

Gruß
MarVol

von Sven W. (woehlb)


Lesenswert?

@MarVol:

Richtig! Wenn ich zwar unterschiedliche Arten von Pages (wxPanels) für 
das Notebook erstelle, und von jeder Art nur eine Page benötige und 
zulasse, ist das eine Möglichkeit.

Was ist aber, wenn ich nur eine Art von Page habe, und von der selben 
Art viele zulasse (wie in einer MDI-Anwendung)? Momentan denke ich, daß 
dann das Löschen der Pages die einzige Möglichkeit ist. Oder?

Bemerkung:
Art = Typ

von Sven W. (woehlb)


Lesenswert?

Halt! Es geht nicht darum das Notebook unsichtbar zu machen sondern die 
Pages (wxPanels). Die wxPanels mit der Methode Hide zu verstecken 
funktioniert aber nicht. Die Notebookseiten verschwinden nicht.

Also, bin ich doch wieder bei meiner ursprünglichen Idee, die Pages aus 
dem Notebook zu löschen.

von Mar V. (marvol)


Lesenswert?

Ok. Ich würde sie auch im Konstruktor löschen, allerdings bin ich mir 
nicht sicher, wie Du sicher stellen willst, dass alle gelöscht worden 
sind. Ich finde keine Doku über AUINotebook, aber im normalen wxNotebook 
existiert die Funktion:  DeleteAllPages()

Gruß
MarVol

von Mar V. (marvol)


Lesenswert?

Ich habe nun die Doku gefunden, aber alles ein wenig undurchsichtig. 
Alle Pages sind wohl mit wxAuiNotebook::GetPageCount zu finden und dann 
in einer Schleife zu löschen. Es gibt noch einen Befehl remove, der 
behält noch eine Instanz, aber wie man diese wieder aktivieren kann, 
habe ich nicht gefunden.

Gruß
MarVol

von Sven W. (woehlb)


Lesenswert?

Ich kann alle Pages löschen, da ich ja weis, welche ich mit dem 
wxFormbuilder erzeugt habe. Auf die Weise wie oben gezeigt. Erst den 
Index ermitteln, und dann löschen.

i = this->m_auinotebook4->GetPageIndex(this->m_panel0);
this->m_auinotebook4->DeletePage(i);

Wie allerdings die Seiten später verwaltet werden, da bin ich im Moment 
noch nicht ganz soweit. Ich stelle mir da aber eine Liste vor, die die 
pointer auf die Seiten enthält. Die Frage ist nur muß ich auch den Typ 
der Seite speichern, oder gibt es eine Typprüfung? Denn es soll nur 
möglich sein, von jedem Typ eine Seite zu öffnen.

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.