the coordinates according to the scrollbar positions, and setting the
scroll positions, thumb sizes and ranges according to the area in view.
-As with all windows, an application can draw onto a wxScrolledWindow using a \helpref{device context}{dcoverview}.
-
-You have the option of handling the \helpref{OnPaint}{wxscrolledwindowonpaint} handler
+Starting from version 2.4 of wxWidgets, there are several ways to use a
+wxScrolledWindow. In particular, there are now three ways to set the
+size of the scrolling area:
+
+One way is to set the scrollbars directly using a call to
+\helpref{wxScrolledWindow::SetScrollbars}{wxscrolledwindowsetscrollbars}.
+This is the way it used to be in any previous version of wxWidgets
+and it will be kept for backwards compatibility.
+
+An additional method of manual control, which requires a little less
+computation of your own, is to set the total size of the scrolling area by
+calling either \helpref{wxWindow::SetVirtualSize}{wxwindowsetvirtualsize},
+or \helpref{wxWindow::FitInside}{wxwindowfitinside}, and setting the
+scrolling increments for it by calling
+\helpref{wxScrolledWindow::SetScrollRate}{wxscrolledwindowsetscrollrate}.
+Scrolling in some orientation is enabled by setting a non zero increment
+for it.
+
+The most automatic and newest way is to simply let sizers determine the
+scrolling area. This is now the default when you set an interior sizer
+into a wxScrolledWindow with \helpref{wxWindow::SetSizer}{wxwindowsetsizer}.
+The scrolling area will be set to the size requested by the sizer and
+the scrollbars will be assigned for each orientation according to the need
+for them and the scrolling increment set by
+\helpref{wxScrolledWindow::SetScrollRate}{wxscrolledwindowsetscrollrate}.
+As above, scrolling is only enabled in orientations with a non-zero
+increment. You can influence the minimum size of the scrolled area
+controlled by a sizer by calling
+\helpref{wxWindow::SetVirtualSizeHints}{wxwindowsetvirtualsizehints}.
+(calling \helpref{wxScrolledWindow::SetScrollbars}{wxscrolledwindowsetscrollbars}
+ has analogous effects in wxWidgets 2.4 -- in later versions it may not continue
+ to override the sizer)
+
+Note: if Maximum size hints are still supported by SetVirtualSizeHints, use
+them at your own dire risk. They may or may not have been removed for 2.4,
+but it really only makes sense to set minimum size hints here. We should
+probably replace SetVirtualSizeHints with SetMinVirtualSize or similar
+and remove it entirely in future.
+
+As with all windows, an application can draw onto a wxScrolledWindow using
+a \helpref{device context}{dcoverview}.
+
+You have the option of handling the OnPaint handler
or overriding the \helpref{OnDraw}{wxscrolledwindowondraw} function, which is passed
a pre-scrolled device context (prepared by \helpref{PrepareDC}{wxscrolledwindowpreparedc}).
within OnDraw, to set the device origin for the device context according to the current
scroll position.
+A wxScrolledWindow will normally scroll itself and therefore its child windows as well. It
+might however be desired to scroll a different window than itself: e.g. when designing a
+spreadsheet, you will normally only have to scroll the (usually white) cell area, whereas the
+(usually grey) label area will scroll very differently. For this special purpose, you can
+call \helpref{SetTargetWindow}{wxscrolledwindowsettargetwindow} which means that pressing
+the scrollbars will scroll a different window.
+
+Note that the underlying system knows nothing about scrolling coordinates, so that all system
+functions (mouse events, expose events, refresh calls etc) as well as the position of subwindows
+are relative to the "physical" origin of the scrolled window. If the user insert a child window at
+position (10,10) and scrolls the window down 100 pixels (moving the child window out of the visible
+area), the child window will report a position of (10,-90).
+
+
\wxheading{Derived from}
+\helpref{wxPanel}{wxpanel}\\
\helpref{wxWindow}{wxwindow}\\
\helpref{wxEvtHandler}{wxevthandler}\\
\helpref{wxObject}{wxobject}
+\wxheading{Include files}
+
+<wx/scrolwin.h>
+
\wxheading{Window styles}
\twocolwidtha{5cm}
\wxheading{See also}
-\helpref{wxScrollBar}{wxscrollbar}, \helpref{wxClientDC}{wxclientdc}, \helpref{wxPaintDC}{wxpaintdc}
+\helpref{wxScrollBar}{wxscrollbar}, \helpref{wxClientDC}{wxclientdc},\\
+\helpref{wxPaintDC}{wxpaintdc}, \helpref{wxVScrolledWindow}{wxvscrolledwindow}
\latexignore{\rtfignore{\wxheading{Members}}}
Default constructor.
-\func{}{wxScrolledWindow}{\param{wxWindow*}{ parent}, \param{const wxWindowID }{id = -1},\rtfsp
+\func{}{wxScrolledWindow}{\param{wxWindow*}{ parent}, \param{wxWindowID }{id = -1},\rtfsp
\param{const wxPoint\& }{pos = wxDefaultPosition}, \param{const wxSize\& }{size = wxDefaultSize},\rtfsp
-\param{const long}{ style = wxHSCROLL \pipe wxVSCROLL}, \param{const wxString\& }{name = ``scrolledWindow"}}
+\param{long}{ style = wxHSCROLL \pipe wxVSCROLL}, \param{const wxString\& }{name = ``scrolledWindow"}}
Constructor.
Destructor.
+\membersection{wxScrolledWindow::CalcScrolledPosition}\label{wxscrolledwindowcalcscrolledposition}
+
+\constfunc{void}{CalcScrolledPosition}{
+ \param{int }{x},
+ \param{int }{y},
+ \param{int *}{xx}
+ \param{int *}{yy}}
+
+Translates the logical coordinates to the device ones. For example, if a window is
+scrolled 10 pixels to the bottom, the device coordinates of the origin are (0, 0)
+(as always), but the logical coordinates are (0, 10) and so the call to
+CalcScrolledPosition(0, 10, \&xx, \&yy) will return 0 in yy.
+
+\wxheading{See also}
+
+\helpref{CalcUnscrolledPosition}{wxscrolledwindowcalcunscrolledposition}
+
+\pythonnote{The wxPython version of this methods accepts only two
+parameters and returns xx and yy as a tuple of values.}
+
+\perlnote{In wxPerl this method takes two parameters and returns a
+2-element list {\tt ( xx, yy )}.}
+
+\membersection{wxScrolledWindow::CalcUnscrolledPosition}\label{wxscrolledwindowcalcunscrolledposition}
+
+\constfunc{void}{CalcUnscrolledPosition}{
+ \param{int }{x},
+ \param{int }{y},
+ \param{int *}{xx}
+ \param{int *}{yy}}
+
+Translates the device coordinates to the logical ones. For example, if a window is
+scrolled 10 pixels to the bottom, the device coordinates of the origin are (0, 0)
+(as always), but the logical coordinates are (0, 10) and so the call to
+CalcUnscrolledPosition(0, 0, \&xx, \&yy) will return 10 in yy.
+
+\wxheading{See also}
+
+\helpref{CalcScrolledPosition}{wxscrolledwindowcalcscrolledposition}
+
+\pythonnote{The wxPython version of this methods accepts only two
+parameters and returns xx and yy as a tuple of values.}
+
+\perlnote{In wxPerl this method takes two parameters and returns a
+2-element list {\tt ( xx, yy )}.}
+
\membersection{wxScrolledWindow::Create}\label{wxscrolledwindowcreate}
-\func{bool}{Create}{\param{wxWindow*}{ parent}, \param{const wxWindowID }{id = -1},\rtfsp
+\func{bool}{Create}{\param{wxWindow*}{ parent}, \param{wxWindowID }{id = -1},\rtfsp
\param{const wxPoint\& }{pos = wxDefaultPosition}, \param{const wxSize\& }{size = wxDefaultSize},\rtfsp
-\param{const long}{ style = wxHSCROLL \pipe wxVSCROLL}, \param{const wxString\& }{name = ``scrolledWindow"}}
+\param{long}{ style = wxHSCROLL \pipe wxVSCROLL}, \param{const wxString\& }{name = ``scrolledWindow"}}
Creates the window for two-step construction. Derived classes
should call or replace this function. See \helpref{wxScrolledWindow::wxScrolledWindow}{wxscrolledwindowconstr}\rtfsp
scrolling is the physical transfer of bits up or down the
screen when a scroll event occurs. If the application scrolls by a
variable amount (e.g. if there are different font sizes) then physical
-scrolling will not work, and you should switch it off.
+scrolling will not work, and you should switch it off. Note that you
+will have to reposition child windows yourself, if physical scrolling
+is disabled.
\wxheading{Parameters}
-\docparam{xScrolling}{If TRUE, enables physical scrolling in the x direction.}
+\docparam{xScrolling}{If true, enables physical scrolling in the x direction.}
-\docparam{yScrolling}{If TRUE, enables physical scrolling in the y direction.}
+\docparam{yScrolling}{If true, enables physical scrolling in the y direction.}
\wxheading{Remarks}
\wxheading{See also}
\helpref{wxScrolledWindow::SetScrollbars}{wxscrolledwindowsetscrollbars},\rtfsp
-\helpref{wxScrolledWindow::GetVirtualSize}{wxscrolledwindowgetvirtualsize},\rtfsp
-\helpref{wxWindow::GetScrollPage}{wxwindowgetscrollpage}
+\helpref{wxScrolledWindow::GetVirtualSize}{wxscrolledwindowgetvirtualsize}
+
+\pythonnote{The wxPython version of this methods accepts no
+parameters and returns a tuple of values for xUnit and yUnit.}
+
+\perlnote{In wxPerl this method takes no parameters and returns a
+2-element list {\tt ( xUnit, yUnit )}.}
+
+\membersection{wxScrolledWindow::GetViewStart}\label{wxscrolledwindowgetviewstart}
+
+\constfunc{void}{GetViewStart}{\param{int* }{x}, \param{int* }{ y}}
+
+Get the position at which the visible portion of the window starts.
+
+\wxheading{Parameters}
+
+\docparam{x}{Receives the first visible x position in scroll units.}
+
+\docparam{y}{Receives the first visible y position in scroll units.}
+
+\wxheading{Remarks}
+
+If either of the scrollbars is not at the home position, {\it x} and/or
+\rtfsp{\it y} will be greater than zero. Combined with \helpref{wxWindow::GetClientSize}{wxwindowgetclientsize},
+the application can use this function to efficiently redraw only the
+visible portion of the window. The positions are in logical scroll
+units, not pixels, so to convert to pixels you will have to multiply
+by the number of pixels per scroll increment.
+
+\wxheading{See also}
+
+\helpref{wxScrolledWindow::SetScrollbars}{wxscrolledwindowsetscrollbars}
+
+\pythonnote{The wxPython version of this methods accepts no
+parameters and returns a tuple of values for x and y.}
+
+\perlnote{In wxPerl this method takes no parameters and returns a
+2-element list {\tt ( x, y )}.}
\membersection{wxScrolledWindow::GetVirtualSize}\label{wxscrolledwindowgetvirtualsize}
\wxheading{See also}
\helpref{wxScrolledWindow::SetScrollbars}{wxscrolledwindowsetscrollbars},\rtfsp
-\helpref{wxScrolledWindow::GetScrollPixelsPerUnit}{wxscrolledwindowgetscrollpixelsperunit},\rtfsp
-\helpref{wxWindow::GetScrollPage}{wxwindowgetscrollpage}
+\helpref{wxScrolledWindow::GetScrollPixelsPerUnit}{wxscrolledwindowgetscrollpixelsperunit}
+
+\pythonnote{The wxPython version of this methods accepts no
+parameters and returns a tuple of values for x and y.}
+
+\perlnote{In wxPerl this method takes no parameters and returns a
+2-element list {\tt ( x, y )}.}
\membersection{wxScrolledWindow::IsRetained}\label{wxscrolledwindowisretained}
\constfunc{bool}{IsRetained}{\void}
-TRUE if the window has a backing bitmap.
+Motif only: true if the window has a backing bitmap.
\membersection{wxScrolledWindow::PrepareDC}\label{wxscrolledwindowpreparedc}
Call this function to prepare the device context for drawing a scrolled image. It
sets the device origin according to the current scroll position.
-PrepareDC is called automatically within the default \helpref{wxScrolledWindow::OnPaint}{wxscrolledwindowonpaint} event
+PrepareDC is called automatically within the default wxScrolledWindow::OnPaint event
handler, so your \helpref{wxScrolledWindow::OnDraw}{wxscrolledwindowondraw} override
will be passed a 'pre-scrolled' device context. However, if you wish to draw from
outside of OnDraw (via OnPaint), or you wish to implement OnPaint yourself, you must
call this function yourself. For example:
\begin{verbatim}
-void MyCanvas::OnEvent(wxMouseEvent& event)
+void MyWindow::OnEvent(wxMouseEvent& event)
{
wxClientDC dc(this);
PrepareDC(dc);
\func{virtual void}{OnDraw}{\param{wxDC\& }{dc}}
-Called by the default \helpref{wxScrolledWindow::OnPaint}{wxscrolledwindowonpaint} implementation
-to allow the application to define painting behaviour without having to worry about
-calling \helpref{wxScrolledWindow::PrepareDC}{wxscrolledwindowpreparedc}.
-
-\membersection{wxScrolledWindow::OnPaint}\label{wxscrolledwindowonpaint}
-
-\func{void}{OnPaint}{\param{wxPaintEvent\& }{event}}
-
-Sent to the window when the window must be refreshed.
-
-For more details, see \helpref{wxWindow::OnPaint}{wxwindowonpaint}.
-
-The default implementation for wxScrolledWindow's OnPaint handler is simply:
-
-\begin{verbatim}
-void wxScrolledWindow::OnPaint(wxPaintEvent& event)
-{
- wxPaintDC dc(this);
- PrepareDC(dc);
-
- OnDraw(dc);
-}
-\end{verbatim}
-
-\membersection{wxScrolledWindow::OnScroll}\label{wxscrolledwindowonscroll}
-
-\func{void}{OnScroll}{\param{wxScrollEvent\& }{event}}
+Called by the default paint event handler to allow the application to define
+painting behaviour without having to worry about calling
+\helpref{wxScrolledWindow::PrepareDC}{wxscrolledwindowpreparedc}.
-Override this function to intercept scroll events. This
-member function implements the default scroll behaviour. If
-you do not call the default function, you will have to manage
-all scrolling behaviour including drawing the window contents
-at an appropriate position relative to the scrollbars.
-
-For more details, see \helpref{wxWindow::OnScroll}{wxwindowonscroll}.
-
-\wxheading{See also}
-
-\helpref{wxScrollEvent}{wxscrollevent}
+Instead of overriding this function you may also just process the paint event
+in the derived class as usual, but then you will have to call PrepareDC()
+yourself.
\membersection{wxScrolledWindow::Scroll}\label{wxscrolledwindowscroll}
\func{void}{SetScrollbars}{\param{int}{ pixelsPerUnitX}, \param{int}{ pixelsPerUnitY},\rtfsp
\param{int}{ noUnitsX}, \param{int}{ noUnitsY},\rtfsp
-\param{int }{xPos = 0}, \param{int}{ yPos = 0}}
+\param{int }{xPos = 0}, \param{int}{ yPos = 0},\rtfsp
+\param{bool }{noRefresh = false}}
Sets up vertical and/or horizontal scrollbars.
\docparam{yPos}{Position to initialize the scrollbars in the vertical direction, in scroll units.}
+\docparam{noRefresh}{Will not refresh window if true.}
+
\wxheading{Remarks}
The first pair of parameters give the number of pixels per `scroll step', i.e. amount
necessary to derive a new class from wxWindow, overriding {\bf OnSize} and
adjusting the scrollbars appropriately.
-\membersection{wxScrolledWindow::ViewStart}\label{wxscrolledwindowviewstart}
+\wxheading{See also}
-\constfunc{void}{ViewStart}{\param{int* }{x}, \param{int* }{ y}}
+\helpref{wxWindow::SetVirtualSize}{wxwindowsetvirtualsize}
-Get the position at which the visible portion of the window starts.
+\membersection{wxScrolledWindow::SetScrollRate}\label{wxscrolledwindowsetscrollrate}
-\wxheading{Parameters}
+\func{void}{SetScrollRate}{\param{int}{ xstep}, \param{int}{ ystep}}
-\docparam{x}{Receives the first visible x position in scroll units.}
+Set the horizontal and vertical scrolling increment only. See the pixelsPerUnit
+parameter in SetScrollbars.
-\docparam{y}{Receives the first visible y position in scroll units.}
+\membersection{wxScrolledWindow::SetTargetWindow}\label{wxscrolledwindowsettargetwindow}
-\wxheading{Remarks}
+\func{void}{SetTargetWindow}{\param{wxWindow* }{window}}
-If either of the scrollbars is not at the home position, {\it x} and/or
-\rtfsp{\it y} will be greater than zero. Combined with \helpref{wxWindow::GetClientSize}{wxwindowgetclientsize},
-the application can use this function to efficiently redraw only the
-visible portion of the window. The positions are in logical scroll
-units, not pixels, so to convert to pixels you will have to multiply
-by the number of pixels per scroll increment.
-
-\wxheading{See also}
-
-\helpref{wxScrolledWindow::SetScrollbars}{wxscrolledwindowsetscrollbars}
+Call this function to tell wxScrolledWindow to perform the actual scrolling on
+a different window (and not on itself).