[wxWidgets] Neues Frame mit Tabs (Registerkarten)



  • Hallo an alle,

    Ich hab ein Hauptfester. Nun möchte ich, dass wenn ich auf einen Button drücke, ein neues Fenster mit mehreren Registerkarten öffnet. In jeder Registerkarte sollen sich auch mehrere Buttons befinden.

    Wie funktioniert das mit den Registerkarten, und mit nem neuen Fenster?

    Ich hoffe es kann mir wer helfen.

    Danke im Voraus
    Gruß Robert


  • Mod

    Hm, also es gibt viele Möglichkeiten.
    Ich habe bisher immer es bevorzugt nur eine Frame Klasse zu verwenden, und den Rest über wxPanels zu erledigen.
    Für seperate Fenster verwende ich dann i.d.R. wxDialog.

    Das mit den TabCtrl funktioniert ähnlich, du musst einfach deine unterschiedlichen "Dialoge/Ansichten" von wxPanel ableiten,
    und entsprechend implementieren.

    Lies bitte auch die beiden Artikel zu wxWidgets im Magazin, da wird einiges davon genauer erklärt.

    phlox



  • Ich kann mich jetzt auch irren, aber bieten wxNotebook nicht genau diese Möglichkeit?


  • Mod

    Eichboson schrieb:

    Ich kann mich jetzt auch irren, aber bieten wxNotebook nicht genau diese Möglichkeit?

    Doch doch, wxNotebook ist da schon die richtige Klasse.



  • Hallo

    Danke für die Antworten. Leider blicke ich nicht gannz durch :(.

    void usbprogFrm::WxButton6Click(wxCommandEvent& event)
    {
        wxDialog dialog = new wxDialog(this, 0, "TITLE", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, "TEST");
    }
    

    Hier möchte ich, dass sich ein Dialog öffnet. Leider funktioniert das nicht ganze 😞

    Ich bekomm den Fehler 481 D:\usbprog\trunk\usbprog_tools\Kopie von usbprog-gui\usbprogFrm.cpp conversion from `wxDialog*' to non-scalar type `wxDialog' requested

    Woran liegt denn das?
    Danke im Voraus

    Gruß Robert


  • Mod

    Lies doch bitte die beiden Tutorials zu wxWidgets im Magazin, da wird sowas erklärt.



  • Hallo,

    Ist es zwingend nötig für den Dialog eine neue Klasse anzulegen?


  • Mod

    Empfehlenswert.
    Ansonsten kannst du die Klasse auch als Panel erstellen, und dann nur dem Dialog einfügen.



  • Hallo

    Ich hab jetzt eine KLasse HelpDialog. Hier mal der Konstruktor.
    Obligatorisch der OK Button unten.

    HelpDialog::HelpDialog(wxWindow* parent, int id):wxDialog(parent,wxT("Help"),id)
    {
        wxBoxSizer* mainbox = new wxBoxSizer(wxVERTICAL);
    
        wxNotebook* tab = new wxNotebook(parent, id, wxDefaultPosition, wxDefaultSize, 0, "TAB");
    
        //OK Button
        mainbox->Add(CreateStdDialogButtonSizer(wxOK),0,wxALL,5);
        SetSizer(mainbox);
        SetAutoLayout(true);
        Layout();
        Fit();
    }
    

    Wie kann dem eine defnierte Größe geben??

    So nun zur Notebookklasse. Ich muss ein Objekt erstellen. Und eben 2 Pages dem Objekt hinzufügen, oder?

    Nur wie geht das? Stimmt das anlegen des Notebookobjektes?

    Danke im Voraus
    Gruß Robert


  • Mod

    Also ganz normal einfach die Klasse in den Sizer einfügen.

    Die Notebookpages leitest du am besten von wxPanel ab, und fügst sie dann mittels AddPage zum Notebook hinzu, nach dem du sie erzeugt hast.



  • Razer6 schrieb:

    Hallo

    Danke für die Antworten. Leider blicke ich nicht gannz durch :(.

    void usbprogFrm::WxButton6Click(wxCommandEvent& event)
    {
        wxDialog dialog = new wxDialog(this, 0, "TITLE", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, "TEST");
    }
    

    Hier möchte ich, dass sich ein Dialog öffnet. Leider funktioniert das nicht ganze 😞

    Ich bekomm den Fehler 481 D:\usbprog\trunk\usbprog_tools\Kopie von usbprog-gui\usbprogFrm.cpp conversion from `wxDialog*' to non-scalar type `wxDialog' requested

    Woran liegt denn das?
    Danke im Voraus

    Gruß Robert

    Let the stars shine bright. Das seh ich doch sofort ^^

    wxDialog* dialog etcblabla

    Was du definierst solltest du auch deklarieren. Du reservierst Speicher für einen Zeiger und legst eine Variable des Typs wxDialog an.



  • Leider blicke ich immer noch nicht durch 😞
    Hier mal meine KLasse mit dem Konstruktor:

    class HelpDialog : public wxDialog
    {
        wxNotebook* tab;
        wxPanel* p1;
        wxPanel* p2;
        wxButton* btP1Ok;
        wxButton* btP2Ok;
    protected:
    public:
        HelpDialog(wxWindow* parent, int id);
        virtual ~HelpDialog();
    
    };
    

    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);
        btP1Ok = new wxButton(this,wxNewId(),wxT("Ok"));
        desSizer->Add(btP1Ok,0,wxALL,5);
    
        wxStaticBoxSizer* helpSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,wxT("Description"));
        p2 = new wxPanel(this,-1);
        helpSizer->Add(p1,0,wxALL|wxEXPAND,5);
        btP2Ok = new wxButton(this,wxNewId(),wxT("Ok"));
        helpSizer->Add(btP2Ok,0,wxALL,5);
    
        tab->AddPage(p1, "Description", true, -1);
        tab->AddPage(p2, "Help", false, -1);
    
        SetSizer(mainbox);
        mainbox.
        SetAutoLayout(true);
        Layout();
        Fit();
    }
    

    Diese Fehlermeldungen bekomme ich:

    helpdialog.cpp: In constructor `HelpDialog::HelpDialog(wxWindow*, int)':
    helpdialog.cpp:7: warning: `__base_ctor' is deprecated (declared at C:/Programme/Dev-Cpp/include/common/wx/msw/dialog.h:101)
    
    helpdialog.cpp:28: error: `SetAutoLayout' is not a type
    helpdialog.cpp:28: error: request for member of non-aggregate type before '(' token
    
    mingw32-make.exe: *** [Objects/MingW/helpdialog.o] Error 1
    

    Ich kenn mich leider mit den Widgets nicht so wirklich aus. Ich hoffe mir kann das wer erklären.

    Danke im Voraus
    Gruß Robert


  • Mod

    Verwende bei Pointer -> statt .

    Und OK/Cancel Buttons solltest du am besten mit CreateStdButtonSizer

    http://wxwidgets.org/manuals/stable/wx_wxdialog.html#wxdialog



  • Danke.

    Jetzt lässt es sich mal kompilieren.
    Eine Warning hab ich noch:

    helpdialog.cpp:7: warning: `__base_ctor' is deprecated (declared at C:/Programme/Dev-Cpp/include/common/wx/msw/dialog.h:101)
    

    Woran liegt das?
    Wenn ich nun ein Objekt dieser Kalsse erstelle und anzeige, öffnet sich jedoch nur ein sehr kleines Fenster. Wie kann ich das vergrößern?

    Gruß Robert


  • Mod

    wxWindow::SetSize
    bzw.

    wxWindow::SetMinSize



  • 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 😉


Anmelden zum Antworten