\func{}{wxBufferedDC}{\void}
-\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}}
+\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
-\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}}
+\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
If you use the first, default, constructor, you must call one of the
\helpref{Init}{wxbuffereddcinit} methods later in order to use the object.
time but it also requires more memory as the bitmap is never freed. The bitmap
should have appropriate size, anything drawn outside of its bounds is clipped.}
+\docparam{style}{wxBUFFER\_CLIENT\_AREA to indicate that just the client area of
+the window is buffered, or wxBUFFER\_VIRTUAL\_AREA to indicate that the buffer bitmap
+covers the virtual area (in which case PrepareDC is automatically called for the actual window
+device context).}
\membersection{wxBufferedDC::Init}\label{wxbuffereddcinit}
-\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}}
+\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
-\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}}
+\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
These functions initialize the object created using the default constructor.
Please see \helpref{constructors documentation}{wxbuffereddcctor} for details.
\membersection{wxBufferedPaintDC::wxBufferedPaintDC}\label{wxbufferedpaintdcctor}
-\func{}{wxBufferedPaintDC}{\param{wxWindow *}{window}, \param{const wxBitmap\& }{buffer = wxNullBitmap}}
+\func{}{wxBufferedPaintDC}{\param{wxWindow *}{window}, \param{const wxBitmap\& }{buffer}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
+
+\func{}{wxBufferedPaintDC}{\param{wxWindow *}{window}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
As with \helpref{wxBufferedDC}{wxbuffereddcctor}, you may either provide the
bitmap to be used for buffering or let this object create one internally (in
the latter case, the size of the client part of the window is used).
+Pass wxBUFFER\_CLIENT\_AREA for the {\it style} parameter to indicate that just the client area of
+the window is buffered, or wxBUFFER\_VIRTUAL\_AREA to indicate that the buffer bitmap
+covers the virtual area (in which case PrepareDC is automatically called for the actual window
+device context).
\membersection{wxBufferedPaintDC::\destruct{wxBufferedPaintDC}}\label{wxbufferedpaintdcdtor}
// Double buffering helper.
// ----------------------------------------------------------------------------
+// Assumes the buffer bitmap covers the entire scrolled window,
+// and prepares the window DC accordingly
+#define wxBUFFER_VIRTUAL_AREA 0x01
+
+// Assumes the buffer bitmap only covers the client area;
+// does not prepare the window DC
+#define wxBUFFER_CLIENT_AREA 0x02
+
class wxBufferedDC : public wxMemoryDC
{
public:
// Default ctor, must subsequently call Init for two stage construction.
- wxBufferedDC() : m_dc( 0 )
+ wxBufferedDC() : m_dc( 0 ), m_style(0)
{
}
// Construct a wxBufferedDC using a user supplied buffer.
- wxBufferedDC(wxDC *dc, const wxBitmap &buffer)
+ wxBufferedDC(wxDC *dc, const wxBitmap &buffer, int style = wxBUFFER_CLIENT_AREA)
: m_dc( dc ),
- m_buffer( buffer )
+ m_buffer( buffer ),
+ m_style(style)
{
UseBuffer();
}
// Construct a wxBufferedDC with an internal buffer of 'area'
// (where area is usually something like the size of the window
// being buffered)
- wxBufferedDC(wxDC *dc, const wxSize &area)
+ wxBufferedDC(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA)
: m_dc( dc ),
- m_buffer( area.GetWidth(), area.GetHeight() )
+ m_buffer( area.GetWidth(), area.GetHeight() ),
+ m_style(style)
+
{
UseBuffer();
}
// These reimplement the actions of the ctors for two stage creation, but
// are not used by the ctors themselves to save a few cpu cycles.
- void Init(wxDC *dc, const wxBitmap &buffer)
+ void Init(wxDC *dc, const wxBitmap &buffer, int style = wxBUFFER_CLIENT_AREA)
{
wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
_T("wxBufferedDC already initialised") );
m_dc = dc;
m_buffer = buffer;
+ m_style = style;
UseBuffer();
}
- void Init(wxDC *dc, const wxSize &area)
+ void Init(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA)
{
- Init(dc, wxBitmap(area.GetWidth(), area.GetHeight()));
+ Init(dc, wxBitmap(area.GetWidth(), area.GetHeight()), style);
}
// Blits the buffer to the dc, and detaches the dc from the buffer (so it
wxASSERT_MSG( m_dc != 0,
_T("No underlying DC associated with wxBufferedDC (anymore)") );
- wxCoord x, y;
- GetDeviceOrigin(& x, & y);
+ wxCoord x=0, y=0;
+
+ if (m_style & wxBUFFER_CLIENT_AREA)
+ GetDeviceOrigin(& x, & y);
m_dc->Blit( 0, 0,
m_buffer.GetWidth(), m_buffer.GetHeight(), this,
m_dc = NULL;
}
+ // Set and get the style
+ void SetStyle(int style) { m_style = style; }
+ int GetStyle() const { return m_style; }
+
private:
// check that the bitmap is valid and use it
void UseBuffer()
// the buffer (selected in this DC)
wxBitmap m_buffer;
+ // the buffering style
+ int m_style;
+
DECLARE_NO_COPY_CLASS(wxBufferedDC)
};
class wxBufferedPaintDC : public wxBufferedDC
{
public:
- // If no bitmap is supplied by the user, a temporary one wil; be created.
- wxBufferedPaintDC(wxWindow *window, const wxBitmap& buffer = wxNullBitmap)
+ // If no bitmap is supplied by the user, a temporary one will be created.
+ wxBufferedPaintDC(wxWindow *window, const wxBitmap& buffer, int style = wxBUFFER_CLIENT_AREA)
: m_paintdc(window)
{
+ // If we're buffering the virtual window, scale the paint DC as well
+ if (style & wxBUFFER_VIRTUAL_AREA)
+ window->PrepareDC( m_paintdc );
+
if( buffer != wxNullBitmap )
- Init(&m_paintdc, buffer);
+ Init(&m_paintdc, buffer, style);
else
- Init(&m_paintdc, window->GetClientSize());
+ Init(&m_paintdc, window->GetClientSize(), style);
+ }
+
+ // If no bitmap is supplied by the user, a temporary one will be created.
+ wxBufferedPaintDC(wxWindow *window, int style = wxBUFFER_CLIENT_AREA)
+ : m_paintdc(window)
+ {
+ // If we're using the virtual window, scale the paint DC as well
+ if (style & wxBUFFER_VIRTUAL_AREA)
+ window->PrepareDC( m_paintdc );
+
+ Init(&m_paintdc, window->GetClientSize(), style);
}
// default copy ctor ok.