Zweiten wxFrame sichtbar machen?

  • Themenstarter Themenstarter Roger
  • Beginndatum Beginndatum
R

Roger

Hallo zusammen

Ich schreibe gerade eine Anwendung mit wxWidgets unter Linux Karmic, CodeBlocks und wxSmith.

Ich kann das Haupt-wxFrame sichtbar machen und auch Dialoge öffnen klappt super.

Problem:
Ich möchte ein zweites wxFrame sichtbar machen, weil ich eine weitgehend Full-Screen-Anwendung schreiben möchte.
(Optionen oder Suchen können schon Dialoge sein, das Meiste sollte aber Full-Screen- wxFrames sein).
Ich kann das Haupt-wxFrame mit this->Maximize(); maximieren, doch die wxDialoge nicht.
Nun habe ich ein zweites wxFrame gemacht, doch ich schaffe es nicht, dass dieses sichtbar wird. Es sollte doch möglich
sein zwischen mehreren wxFrames "hin und her zu schalten".

Ich möchte bei Button-Click im Hauptframe ein zweites wxFrame aufmachen, das ich zuvor mit wsSmith gemacht habe:

--------------------------------------------------------
#include "NewFrame.h" // zweites wxFrame im HauptFrame.h eingebunden
--------------------------------------------------------

Code im HauptFrame.cpp:

void HauptFrame::OnBitmapButtonBeispielClick(wxCommandEvent& event)
{
NewFrame NewFrameFrame(this);
NewFrameFrame.Show();
this->Hide();
}
--------------------------------------------------------


Problem: Ich schaffe es nicht, dass das zweite Fenster sichtbar wird. Das Haupt-wxFrame wird zwar verborgen,
aber NewFrame wird nicht sichtbar. Ist dies ein Fehler von wxWidgets?

Es sollte doch klar sein:
NewFrameFrame.Show(); // = mach NewFrameFrame sichtbar
this->Hide(); // = mach HauptFrame unsichtbar


Bei einem Dialog funktioniert es problemlos:
Mit: CustomerSearchDlg.ShowModal(); wird ein Dialog sichtbar.

Aber warum funktioniert das nicht so bei einem zweiten wxFrame oder wie schaffe ich es, ein zweites wxFrame sichtbar und das
Haput-wxFrame unsichtbar zu machen? Wenn das zweite wxFrame (NewFrameFrame) geschlossen wird sollte das
Haupt-wxFrame (HauptFrame) natürlich wieder sichtbar werden.

Kann mir jemand helfen?
 
Wenn ich deinen Code richtig verstehe, hast du den HauptFrame als parent für dein NewFrame angegeben. Vermutlich wird deswegen dein NewFrame auf unsichtbar geschaltet, wenn du den HauptFrame verbirgst.
 
Danke Vereth

Ja, das stimmt. Ich habe es aber auch schon mit :
NewFrame NewFrameFrame(0); und mit NewFrame NewFrameFrame(NULL);
versucht. Geht auch nicht.

Habe auch schon folgendes versucht:

-------------------------------------
void HauptFrame::OnBitmapButtonBeispielClick(wxCommandEvent& event)
{

NewFrame NewFrameFrame(this);
NewFrameFrame.Maximize();

wxWindowList::Node* node = wxTopLevelWindows.GetFirst();

while (node)
{
wxTopLevelWindow* win = (wxTopLevelWindow*) node->GetData();

if (win)
{
wxMessageBox(wxT("if (win)-Teil: ja "), wxT("xxx"));
}


}
node = node->GetNext();
}
-------------------------------------

Im obigen Beispiel wird das "NewFrameFrame"-Fenster zwar angezeigt, aber sobald ich die wxMessageBox zu mache,
verschwindet das "NewFrameFrame"-Fenster wieder. Lasse ich die wxMessageBox weg, so wird das "NewFrameFrame"-Fenster
nicht angezeigt (wie gehabt).

dito folgender Versucht:
-------------------------------------
void HauptFrame::OnBitmapButtonBeispielClick(wxCommandEvent& event)
{

NewFrame NewFrameFrame(this);
NewFrameFrame.MakeModal();
NewFrameFrame.Maximize();

wxWindowList::Node* node = wxTopLevelWindows.GetFirst();

while (node)
{
wxDialog* dialog = wxDynamicCast(node->GetData(), wxDialog);

if (dialog && dialog->IsModal())
{
wxMessageBox(wxT("dialog->IsModal(): "), wxT("Welcome to..."));
}
}
node = node->GetNext();
}
-------------------------------------

Hier (oben) mache ich das zweite wxFrame mit NewFrameFrame.MakeModal(); sozusagen zum Dialog, normalerweise
hat wxFrame ja keine Methode "ShowModal()". Aber zu NewFrameFrame.MakeModal(); motzt der Compiler nicht, das
HauptFrame wird "grau/inaktiv", das NewFrameFrame wird angezeigt und darüber die wxMessageBox. Klicke ich die
wxMessageBox weg verschwindet auch NewFrameFrame automatisch. Kommentiere ich die wxMessageBox in einem
weiteren aus, so wird NewFrameFrame wiederum gar nicht angezeigt.

Ich bin ja kein Fan um alles zu verkomplizieren. Darum verstehe ich nicht, warum es nicht ganz einfach gehen soll, wie
z.B. bei den Dialogen. Ich sollte doch wirklich "sagen" können: "Hauptframe Hide(), neues Frame Show()!".

Aber du hasst wahrscheinlich schon recht, dass es mit "parent" zusammen hängt. Aber das würde ich ja gut finden, wenn
NewFrame das Kind vom HauptFrame ist - ist es ja auch. Das Kind wird auch erzeugt, nur sichtbar ist es nicht. Als ob ich
zum Spass: NewFrameFrame.Show(); codieren würde! (I can't see the shxx frame!)

Man o man, NewFrameFrame.Show();, this->Hide(); klarer kann ich es dem Compiler wirklich nicht sagen, was ich möchte.
Nimmt mich nur Wunder, ob ich zuerst drei Purzelbäume und drei Handstände machen muss, bis der Kompi das begreift ;-)

(Sorry für die ss, so was wie das ß-Zeichen kennen wir ich Switzerland nicht)
 
Problem gelöst

Ich belasse die wxDialog und setze die Flags: wxSYSTEM_MENU und wxRESIZE_BORDER.
Dann funktioniert auch this->Maximize();
So habe ich das, was ich wollte: Die Dialoge werden beim Initialisieren auf "Full-Screen" gesetzt.
 
Unter:
http://wiki.codeblocks.org/index.php?title=WxSmith_tutorial:_Working_with_multiple_resources

im Abschnitt (ganz unten): Using dialog and frame window in non-modal mode

wird alles sehr gut erklärt.

Es gibt also einen Unterschied, ob man einen Dialog/Frame so:
CustomerShow CustomerShowDlg(this, ID_CUSTOMER_SHOW_DIALOG, wxDefaultPosition, wxDefaultSize);
CustomerShowDlg.ShowModal();

oder so «konstruiert»:
CustomerShow* CustomerShowDlg = new CustomerShow(this);
CustomerShowDlg->Show();
 
Hallo

Weiss jemand warum sich ein (zweites) Frame, welches mit

NewFrame* frm = new NewFrame(0);
frm->Show();

erzeugt wurde, sich nicht mehr mit Close(); schliessen lässt?
Der zweite Frame lässt sich nur mit dem x oben schliessen,
nicht aber mit der Methode Close(); als Event hinter einem
Button. Close(true); (Force) oder Destroy() geht auch nicht.

Gruss Roger
 
Genau kann ich dir das auch nicht sagen, aber probiere mal, ob es funktioniert, wenn du vorher den Fokus auf dieses Frame setzt.
 
Zurück