wxWidgets: eigenes control erstellen



  • Hallo,

    würde gerne einige wxTextCtrl, wxButton und wxStaticText Objekte in einer
    eigenen Klasse zusammenfassen, so dass auf verschiedenen wxPanels immer nur ein
    Objekt dieser neuen Klasse erstellt werden muss, und trotzdem alles gleich
    ausschaut.

    Soweit so schlecht.
    Hab mir eine Klasse gebaut, diese von wxWindow abgeleitet, dort drinnen einen
    Sizer erstellt und die entsprechenden Objekte (textCtrl, button, staticText)
    in den Sizer eingefügt und dann denn Sizer mittel SetSizer() in der neuen Klasse gesetzt.

    Kompiliert auch alles wunderbar, nur leider liegen jetzt alle Elemente aufeinander (ungefähr so, als wenn man alles auf Position (0, 0) legen würde)

    Als nächstes hab ich die Klasse anstatt von wxWindow von wxPanel abgeleitet
    Fazit: jetzt wird der Sizer berücksichtigt, aber wenn ich die ein Objekt meiner
    Klasse in einen Sizer auf einem Panel einfüge, dann liegt alles ausserhalb des Sizers.

    So, dann von wxControl abgeleitet.
    Ergebnis:
    Kombination aus den vorherigen beiden ausserdem ist zusätzlich noch ein
    Kasten aussen rum.

    Das einzige, was bisher halbwegs funktioniert hat, ist:
    Die Klasse von wxBoxSizer ableiten.

    Problem:
    Die Klasse kann dann keine Events verarbeiten.

    Bin jetzt wirklich ratlos...

    Hier noch a bissl Code:

    class myControl : public wxWindow // ( bzw. public wxPanel, wxControl, wxBoxsizer)
    {
    public:
       myControl(wxWindow * Parent);
    };
    
    myControl::myControl:
    // hier den Kontruktur der entsprechenden übergeordneten Klasse aufrufen
    // z. B.
    wxWindow(Parent, wxID_ANY)
    {
    wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
    SetSizer(sizer);
    
    wxTextCtrl * text1 = new wxTextCtrl(this, wxID_ANY, "text 1");
    wxTextCtrl * text2 = new wxTextCtrl(this, wxID_ANY, "text 2");
    wxTextCtrl * text3 = new wxTextCtrl(this, wxID_ANY, "text 3");
    
    sizer->Add(text1);
    sizer->Add(text2);
    sizer->Add(text3);
    }
    

    Zusammenfassung:

    von wxWindow abgeleitet:
    alle textCtrls liegen aufeinander

    von wxPanel abgeleitet:
    textCtrl liegen nebeneinander, ein Objekt der Klasse myControl lässt sich aber
    in keinen Sizer einfügen (liegt dann irgendwo ausserhalb des Sizers)

    von wxControl abgeleitet:
    es erscheint ein Kasten, in dem alle textCtrls aufeinander liegen.
    fügt man ein Objekt von myControl einem Sizer hinzu, liegt der
    Kasten ausserhalb des Sizers.

    Irgendwelche Ideen?
    Ich hab keine mehr 😞

    thx
    Martin



  • Ich hab's mal eben zusammengeklickt. Hier ist der Code den DialogBlocks mir ausspuckt (als wxPanel):

    bool DelMe::Create( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
    {
    ////@begin DelMe member initialisation
    ////@end DelMe member initialisation
    
    ////@begin DelMe creation
        wxPanel::Create( parent, id, pos, size, style );
    
        CreateControls();
        GetSizer()->Fit(this);
        GetSizer()->SetSizeHints(this);
        Centre();
    ////@end DelMe creation
        return TRUE;
    }
    
    /*!
     * Control creation for DelMe
     */
    
    void DelMe::CreateControls()
    {    
    ////@begin DelMe content construction
        DelMe* itemPanel1 = this;
    
        wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
        itemPanel1->SetSizer(itemBoxSizer2);
    
        wxStaticText* itemStaticText3 = new wxStaticText( itemPanel1, wxID_STATIC, _("Static text"), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer2->Add(itemStaticText3, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxADJUST_MINSIZE, 5);
    
        wxStaticText* itemStaticText4 = new wxStaticText( itemPanel1, wxID_STATIC, _("Static text"), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer2->Add(itemStaticText4, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxADJUST_MINSIZE, 5);
    
        wxStaticText* itemStaticText5 = new wxStaticText( itemPanel1, wxID_STATIC, _("Static text"), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer2->Add(itemStaticText5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxADJUST_MINSIZE, 5);
    
    ////@end DelMe content construction
    }
    

    Ich hab's nicht kompiliert, aber in der Vorschau sieht's gut aus, Drei Static-Text-Controls untereinander. Vielleicht hilfts dir ja weiter...



  • AAAAAAAAHHHHHHRRRRRRGGGGG

    erstmal danke, is vom Prinzip her das selbe, wie meine Klasse oben.

    Aber ich hab einen Fehler gemacht:
    hab ein Objekt meiner Klasse oben erstellt,
    und dieses dann aus versehen in zwei verschiedene Sizer eingebettet.
    Kann natürlich ned funktionieren.


Anmelden zum Antworten