wxWidgets: wxScrolledWindow
Willemers Informatik-Ecke
Das wxScrolledWindow ist ein Container, der seinen Inhalt per Scrollbars positioniert.

Eine typische Anwendung ist die Verwendung in einem Frame, der einen Arbeitsbereich einer Grafik hat. Zunächst wird ein eigenes Unterfenster als Ableitung von wxScrolledWindows angelegt.

MyFrame::MyFrame(wxFrame *frame, const wxString& title))
  : wxFrame(frame, -1, title)
{
    ...
    myScrolledWindow= new MyScrolledWindow(this, wxID_ANY, 
                                             wxPoint(0,0), wxSize(100,100));
    ...
}
Die tatsächliche Größe ist an dieser Stelle gleich, sie wird beim Size-Ereignis genau eingepasst. Siehe weiter unten.

Dieses übernimmt nun das Ereignis Paint und zeichnet den INhalt neu.

class MyScrolledWindow: public wxScrolledWindow
{
public:
    MyScrolledWindow() { }
    MyScrolledWindow( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size );

    void OnPaint( wxPaintEvent &event );
private:
    DECLARE_DYNAMIC_CLASS(MyScrolledWindow)
    DECLARE_EVENT_TABLE()
};

IMPLEMENT_DYNAMIC_CLASS(MyScrolledWindow, wxScrolledWindow)

BEGIN_EVENT_TABLE(MyScrolledWindow, wxScrolledWindow)
  EVT_PAINT(      MyScrolledWindow::OnPaint)
END_EVENT_TABLE()

MyScrolledWindow::MyScrolledWindow( wxWindow *parent, wxWindowID id,
                    const wxPoint &pos, const wxSize &size )
    : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER, _T("beispiel") )
{
    SetScrollRate(10, 10); // bestimmt die Rate des Scrollens horizontal und vertikal
    SetBackgroundColour(*wxWHITE); // sorgt für einen weißen Hintergrund
}

void MyScrolledWindow::OnPaint(wxPaintEvent &event)
{
    wxPaintDC dc(this);
    PrepareDC(dc); // Passt den Device Context an das Scrollen an
    // Meine Zeichenfunktion benötigt die Größe des Ausschnitts
    // und wird die Ausdehnung der Grafik ermitteln
    wxSize Ausschnitt = dc.GetSize();
    wxPoint Ursprung = dc.GetDeviceOrigin();
    int x, y;
    this->GetViewStart(&x, &y);
    Ursprung.x = x; Ursprung.y = y;
    wxRect Bereich(Ursprung, Ausschnitt);
    wxSize Ausdehnung;
    MeineZeichenFunktion(dc, Bereich, Ausdehnung);
    SetVirtualSize(Ausdehnung);
}
Es gibt zwei relevante Ausdehnungen. Das eine ist die Ausdehnung des wxScrolledWindows selbst. Es richtet sich nach dem Platz, den ihm das Elternfenster zur Verfügung stellt. Diese Größe wird beim Eintritt des Size-Ereignisses verändert.
void MyFrame::OnSize(wxSizeEvent& event)
{
    wxSize size = this->GetClientSize();
    myScrolledWindow->SetSize(size);
}
Die andere Größe bezieht sich auf die Größe der Grafik, die das ScrolledWindow mit Scrollbars umgibt. Sie wird mit der Funktion SetVirtualSize gesetzt und erfolgt im Beispiel oben in der Funktion OnPaint.