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.