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 aufeinandervon 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 mehrthx
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.