[wxWidgets] Neues Frame mit Tabs (Registerkarten)



  • Danke. Jedoch funktioniert es nicht ganz. Es friert bei mir eigentlich ein habe ich bemerkt. Weiß jemand warum. Es öffnet sich ein kleines Eck von nem Fenster aber das wars.

    Hier der Konstruktor:

    HelpDialog::HelpDialog(wxWindow* parent, int id):wxDialog(parent, wxT("Help"),id)
    {
        wxBoxSizer* mainbox = new wxBoxSizer(wxVERTICAL);
        tab = new wxNotebook(parent, id, wxDefaultPosition, wxDefaultSize, 0, "TAB");
    
        wxStaticBoxSizer* desSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,wxT("Description"));
        p1 = new wxPanel(this,-1);
        desSizer->Add(p1,0,wxALL|wxEXPAND,5);
        desSizer->Add(CreateStdDialogButtonSizer(wxOK),0,wxALL,5);
    
        wxStaticBoxSizer* helpSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,wxT("Description"));
        p2 = new wxPanel(this,-1);
        helpSizer->Add(p1,0,wxALL|wxEXPAND,5);
        helpSizer->Add(CreateStdDialogButtonSizer(wxOK),0,wxALL,5);
    
        tab->AddPage(p1, "Description", true, -1);
        tab->AddPage(p2, "Help", false, -1);
    
        SetMinSize(wxSize(400,300));
        SetSizer(mainbox);
        SetAutoLayout(true);
        Layout();
        Fit();
    }
    

    Gruß Robert


  • Mod

    Das Parent der Controls ist der Dialog selber. Du musst also parent mit this im Konstruktor ersetzen.



  • Wenn ich das habe:

    HelpDialog::HelpDialog(wxWindow* parent, int id):wxDialog(this, wxT("Help"),id)
    

    Beim erzeugen des Objektes schließt das ganze Programm.

    Gruß Robert


  • Mod

    Klar schließt es.
    Ich sprach ja auch vom ersetzen im Konstruktor, nicht beim Konstruktoraufruf von wxDialog.

    ... = new wxNotebook(this,...);
    


  • Geht aber trotzdem nicht mit dem Aufruf:

    tab = new wxNotebook(this, id, wxDefaultPosition, wxDefaultSize, 0, "TAB");
    

    Was ist denn noch falsch?
    Sorry für mein Unwissen 😉

    Gruß Robert


  • Mod

    Du must bzw. darfst nicht die Notebookpages einem Sizer übergeben, sondern nur dem Notebook selber, das macht dann den Rest.

    Ansonsten sieht es ganz gut aus. Hab leider keine Zeit das in der IDE zu testen 😉



  • Danke für die Gedult;)

    HelpDialog::HelpDialog(wxWindow* parent, int id):wxDialog(parent, wxT("Help"),id)
    {
        wxBoxSizer* mainbox = new wxBoxSizer(wxVERTICAL);
        tab = new wxNotebook(this, id, wxDefaultPosition, wxDefaultSize, 0, "TAB");
    
        p1 = new wxPanel(this,-1);
        p2 = new wxPanel(this,-1);
    
        tab->AddPage(p1, "Description", true, -1);
        tab->AddPage(p2, "Help", false, -1);
    
        SetMinSize(wxSize(400,300));
        SetSizer(mainbox);
        SetAutoLayout(true);
        Layout();
        Fit();
    }
    

    Wenn ich das so habe, habe ich jedoch noch immer den gleichen Effekt. Das Programm öffnet ein kleines Eckchen und bleibt hängen. anzeien tu ich den dialog mit showModal(). Weißt du woran das liegt?

    Gruß Robert


  • Mod

    Nein, wie erzeugst/öffnest du denn den Dialog?

    Oh, und wo ich es gerade sehe, das Parent der Notebookseiten ist das Notebook selber!



  • Aufgerufen wird folgendermaßen:

    HelpDialog dlg(this,-1);
        dlg.ShowModal();
    

    Beim Notebook, meinst du so?

    tab = new wxNotebook(tab, id, wxDefaultPosition, wxDefaultSize, 0, "TAB");
    

    Das geht nämlich nicht. Welche ID bekommt das überhaupt? id passt ja auch nicht, oder?

    Gruß Robert


  • Mod

    phlox81 schrieb:

    Oh, und wo ich es gerade sehe, das Parent der Notebookseiten ist das Notebook selber!



  • Ich hab echt schon Tomaten auf den Augen...

    p1 = new wxPanel(tab,-1);
        p2 = new wxPanel(tab,-1);
    

    Das geht aber auch nicht. 😞

    Gruß Robert


  • Mod

    HelpDialog::HelpDialog(wxWindow* parent, int id):wxDialog(parent, wxT("Help"),id)
    {
        wxBoxSizer* mainbox = new wxBoxSizer(wxVERTICAL);
        tab = new wxNotebook(this, id, wxDefaultPosition, wxDefaultSize, 0, "TAB");
    
        p1 = new wxPanel(tab,-1);
        p2 = new wxPanel(tab,-1);
    
        tab->AddPage(p1, "Description", true, -1);
        tab->AddPage(p2, "Help", false, -1);
        //notebook muss natürlich in den Sizer.
        mainbox->Add(tab,1,wxEXPAND|wxALL);
    
        SetMinSize(wxSize(400,300));
        SetSizer(mainbox);
        SetAutoLayout(true);
        Layout();
        Fit();
    }
    

    So müsste es klappen.



  • Danke, so öffnet ess sich schon mal 🙂

    Jedoch ist das ganze sauklein. NIcht die 400x300. Weißt du woran das liegt?

    Gruß Robert


  • Mod

    Musste mal was rumspielen.

    SetMinSize(wxSize(400,300));
    SetSizer(mainbox);
    SetAutoLayout(true);
    

    Evtl hilft es die Reihenfolge von den Funktionen zu vertauschen, bzw. SetAutoLayout mal auszukommentieren etc.

    Und zum Thema Dialog steht eigentlich alles in meinem Tutorial im Magazin:
    http://c-plusplus.net/forum/viewtopic-var-t-is-175682.html



  • Hallo,

    das Fit() störte. Ohne dem geht es 🙂

    Ich möchte, nun dem Panels Texte, Buttons und Bilder hinzufügen. das muss ich doch am Panel machen, oder? Aber die Klasse hat keine Methode Add(). Wie geht das dann?

    Gruß Robert


  • Mod

    Razer6 schrieb:

    Hallo,

    das Fit() störte. Ohne dem geht es 🙂

    Ich möchte, nun dem Panels Texte, Buttons und Bilder hinzufügen. das muss ich doch am Panel machen, oder? Aber die Klasse hat keine Methode Add(). Wie geht das dann?

    Gruß Robert

    Am Besten du legst dafür jeweils eigene von wxPanel abgeleitete Klassen an.
    Das geht auch in den gängigen RAD Tools.



  • In der jetzigen Klasse, noch ne Klasse schreiben die von wxPanel abgeleitet ist?

    Was ist ein RAD Tool?

    Gruß Robert


  • Mod

    Razer6 schrieb:

    In der jetzigen Klasse, noch ne Klasse schreiben die von wxPanel abgeleitet ist?

    Was ist ein RAD Tool?

    Nein, eine neue Klasse für jedes Formular was du in das Notebook aufnehmen möchtest.

    Ein RAD Tool ist ein Tool in dem man eine GUI zusammenklicken kann. wxSmith zum Beispiel, falls du Code::Blocks benutzt.



  • Ok, danke. Ich arbeite mit wxDev C++. Ich hab nun einen Dialog erstellt.

    Der Konstruktor lautet:

    HelpDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Unbenannt1"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = HelpDlg_STYLE);
    

    Wie schaut in dem Fall die Zeile aus, in der ein neues Objekt erzeugt wird?

    Danke im Voraus
    Gruß Robert


  • Mod

    Hm, wie lange machst du eigentlich schon C++?

    HelpDlg dlg(this);
    

    Wäre eine Möglichkeit.


Anmelden zum Antworten