wxWidgets Layout-Management: Sizer
Willemers Informatik-Ecke
Weitere Themen

Simples Rahmenprogramm

In dem folgenden Minimalprogramm wird ein wxStaticText im Konstruktor der wxFrame-Ableitung angelegt. Damit wird es bereits angezeigt. Allerdings wird nur ein Kontrollelement auf einmal angezeigt.
#include <wx/wx.h>
  
class wxControlApp : public wxApp {
    public:
        virtual bool OnInit();
};

class wxControlFrame : public wxFrame {
public:
    wxControlFrame();
};

IMPLEMENT_APP(wxControlApp)

bool wxControlApp::OnInit()
{
    wxControlFrame *frame = new wxControlFrame();
    frame->Show(true);
    SetTopWindow(frame);
    return true;
}

wxControlFrame::wxControlFrame()
    : wxFrame((wxFrame *)0, -1, "Controls", wxPoint(50,50), wxSize(400,300))
{
    wxStaticText* hello = new wxStaticText(this, 1, "Hello World");
}
Sollen mehrere Elemente angezeigt werden, müssen diese in einem Layout zusammengefasst werden.

wxBoxSizer

Der wxBoxSizer stapelt seine Elemente über- oder nebeneinander. Als Parameter erhält der Konstruktor wxVERTICAL oder wxHORIZONTAL, um die Richtung zu bestimmen.
wxControlFrame::wxControlFrame()
    : wxFrame((wxFrame *)0, -1, "Controls", wxPoint(50,50), wxSize(400,300))
{
    wxStaticText* hello = new wxStaticText(this, 1, "Hello World");
    wxButton* button = new wxButton(this, 2, "Klick");
    wxBoxSizer* vertBox = new wxBoxSizer(wxVERTICAL);
    vertBox->Add(hello, 1, wxEXPAND|wxALL, 10);
    vertBox->Add(button, 1, wxEXPAND|wxALL, 10);
    SetSizerAndFit(vertBox);
}
Die Methode Add hat folgende Parameter

wxGridSizer

Der GridSizer legt seine Elemente in enem Gitter ab, deren Felder immer gleich sind. Im Parameter erhält er die Anzahl der Spalten. Beim Auffüllen mit
Add(Element, 1, wxEXPAND, 0, 0);
werden die Elemente von links nach rechts, dann von oben nach unten aufgefüllt.
wxControlFrame::wxControlFrame()
    : wxFrame((wxFrame *)0, -1, "Controls", wxPoint(50,50), wxSize(400,300))
{
    wxGridSizer* grid = new wxGridSizer(4);
    for (int i=0; i<12; i++)
    {
        std::string str = "Feld "+std::to_string(i);
        grid->Add(new wxButton(this, i, str));
    }
    SetSizerAndFit(grid);
}

wxFlexGridSizer

Der FlexGridSizer ordnet seine Elemente auch in einem Raster. Allerdings richtet sich die Größe der Spalten und Zeilen nach der von den Elementen benötigten Größe.
wxControlFrame::wxControlFrame()
    : wxFrame((wxFrame *)0, -1, "Controls", wxPoint(50,50), wxSize(400,300))
{
    wxFlexGridSizer *flex = new wxFlexGridSizer(3);
    for (int i=0; i<4; i++)
    {
        flex->Add(new wxStaticText(this, i*3, "Text"));
        flex->Add(new wxTextCtrl(this, i*3+1, "Ganz viel eingeben"));
        flex->Add(new wxButton(this, i*3+2, "Klick"));
    }
    SetSizerAndFit(flex);

}

Kombination mehrerer Sizer

wxControlFrame::wxControlFrame()
    : wxFrame((wxFrame *)0, -1, "Controls", wxPoint(50,50), wxSize(400,300))
{
    wxFlexGridSizer *flex = new wxFlexGridSizer(3);
    for (int i=0; i<4; i++)
    {
        flex->Add(new wxStaticText(this, i*3, "Text"));
        flex->Add(new wxTextCtrl(this, i*3+1, "Ganz viel eingeben"));
        flex->Add(new wxButton(this, i*3+2, "Klick"));
    }
    wxGridSizer* grid = new wxGridSizer(2);
    grid->Add(new wxButton(this, 12, "OK"));
    grid->Add(new wxButton(this, 12, "Abbruch"));
    wxBoxSizer* vertBox = new wxBoxSizer(wxVERTICAL);
    vertBox->Add(flex, 1, wxEXPAND|wxALL, 2);
    vertBox->Add(grid, 1, wxEXPAND|wxALL, 2);
    SetSizerAndFit(vertBox);
}
Der obere Teil des Fensters enthält den FlexGrid mit den Eingabefeldern. Darunter sind zwei Buttons durch ein Grid zusammengehalten, der dafür sorgt, dass alle Buttons gleich breit sind. Durch die Box wurden sie untereinander angeordnet.