tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
894
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Roger Tutorials.de Gastzugang
    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?
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    Roger Tutorials.de Gastzugang
    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)
     

  4. #4
    Roger Tutorials.de Gastzugang
    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.
     

  5. #5
    Roger Tutorials.de Gastzugang
    Unter:
    http://wiki.codeblocks.org/index.php...iple_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();
     

  6. #6
    Roger Tutorials.de Gastzugang
    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
     

  7. #7
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Genau kann ich dir das auch nicht sagen, aber probiere mal, ob es funktioniert, wenn du vorher den Fokus auf dieses Frame setzt.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

Ähnliche Themen

  1. Antworten: 27
    Letzter Beitrag: 10.05.11, 00:40
  2. Paintbox sichtbar machen
    Von Code46 im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 17.03.09, 08:12
  3. HDI-Map nur in Spiegelung sichtbar machen?
    Von niedi5 im Forum 3D Studio Max
    Antworten: 2
    Letzter Beitrag: 29.04.07, 23:08
  4. DIV sichtbar machen
    Von Flame im Forum CSS
    Antworten: 1
    Letzter Beitrag: 07.02.04, 22:26
  5. kennwort sichtbar machen
    Von ziriander im Forum Microsoft Windows
    Antworten: 3
    Letzter Beitrag: 11.08.03, 20:50