X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d6f0a4b367c6d68d9fea84817f5a982163665f37..2d956b58023a4955313a1c1531bc70a0deb0b831:/src/msw/dcmemory.cpp diff --git a/src/msw/dcmemory.cpp b/src/msw/dcmemory.cpp index 64ff3c778f..744f2ae65a 100644 --- a/src/msw/dcmemory.cpp +++ b/src/msw/dcmemory.cpp @@ -41,7 +41,7 @@ // wxWin macros // ---------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC) +IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC) // ============================================================================ // implementation @@ -53,37 +53,47 @@ wxMemoryDC::wxMemoryDC() { - m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) NULL); - m_ok = (m_hDC != 0); - m_bOwnsDC = TRUE; - - SetBrush(*wxWHITE_BRUSH); - SetPen(*wxBLACK_PEN); + CreateCompatible(NULL); - // the background mode is only used for text background and is set in - // DrawText() to OPAQUE as required, otherwise always TRANSPARENT - ::SetBkMode( GetHdc(), TRANSPARENT ); + Init(); } -wxMemoryDC::wxMemoryDC(wxDC *old_dc) +wxMemoryDC::wxMemoryDC(wxDC *dc) { - old_dc->BeginDrawing(); + wxCHECK_RET( dc, _T("NULL dc in wxMemoryDC ctor") ); - m_hDC = (WXHDC) ::CreateCompatibleDC(GetHdcOf(*old_dc)); - m_ok = (m_hDC != 0); + dc->BeginDrawing(); - old_dc->EndDrawing(); + CreateCompatible(dc); - SetBrush(*wxWHITE_BRUSH); - SetPen(*wxBLACK_PEN); + dc->EndDrawing(); - // the background mode is only used for text background and is set in - // DrawText() to OPAQUE as required, otherwise always TRANSPARENT - ::SetBkMode( GetHdc(), TRANSPARENT ); + Init(); } -wxMemoryDC::~wxMemoryDC() +void wxMemoryDC::Init() { + if ( m_ok ) + { + SetBrush(*wxWHITE_BRUSH); + SetPen(*wxBLACK_PEN); + + // the background mode is only used for text background and is set in + // DrawText() to OPAQUE as required, otherwise always TRANSPARENT + ::SetBkMode( GetHdc(), TRANSPARENT ); + } +} + +bool wxMemoryDC::CreateCompatible(wxDC *dc) +{ + m_hDC = (WXHDC)::CreateCompatibleDC(dc ? GetHdcOf(*dc) : NULL); + + // as we created the DC, we must delete it in the dtor + m_bOwnsDC = TRUE; + + m_ok = m_hDC != 0; + + return m_ok; } void wxMemoryDC::SelectObject(const wxBitmap& bitmap) @@ -102,8 +112,7 @@ void wxMemoryDC::SelectObject(const wxBitmap& bitmap) // check for whether the bitmap is already selected into a device context wxCHECK_RET( !bitmap.GetSelectedInto() || (bitmap.GetSelectedInto() == this), - wxT("Bitmap is selected in another wxMemoryDC, delete the " - "first wxMemoryDC or use SelectObject(NULL)") ); + wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") ); m_selectedBitmap = bitmap; WXHBITMAP hBmp = m_selectedBitmap.GetHBITMAP(); @@ -115,7 +124,7 @@ void wxMemoryDC::SelectObject(const wxBitmap& bitmap) if ( !hBmp ) { - wxLogLastError("SelectObject(memDC, bitmap)"); + wxLogLastError(wxT("SelectObject(memDC, bitmap)")); wxFAIL_MSG(wxT("Couldn't select a bitmap into wxMemoryDC")); } @@ -139,6 +148,13 @@ void wxMemoryDC::DoGetSize(int *width, int *height) const } } +// the rest of this file deals with drawing rectangles workaround, disabled by +// default + +#define wxUSE_MEMORY_DC_DRAW_RECTANGLE 0 + +#if wxUSE_MEMORY_DC_DRAW_RECTANGLE + // For some reason, drawing a rectangle on a memory DC has problems. // Use this substitute if we can. static void wxDrawRectangle(wxDC& dc, wxCoord x, wxCoord y, wxCoord width, wxCoord height) @@ -167,22 +183,24 @@ static void wxDrawRectangle(wxDC& dc, wxCoord x, wxCoord y, wxCoord width, wxCoo } } +#endif // wxUSE_MEMORY_DC_DRAW_RECTANGLE + void wxMemoryDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { -// Set this to 0 to demonstrate strange rectangle behaviour in the Drawing sample. -#if 0 + // Set this to 1 to work around an apparent video driver bug + // (visible with e.g. 70x70 rectangle on a memory DC; see Drawing sample) +#if wxUSE_MEMORY_DC_DRAW_RECTANGLE if (m_brush.Ok() && m_pen.Ok() && (m_brush.GetStyle() == wxSOLID || m_brush.GetStyle() == wxTRANSPARENT) && - (m_pen.GetStyle() == wxSOLID || m_pen.GetStyle() == wxTRANSPARENT)) + (m_pen.GetStyle() == wxSOLID || m_pen.GetStyle() == wxTRANSPARENT) && + (GetLogicalFunction() == wxCOPY)) { wxDrawRectangle(* this, x, y, width, height); } else +#endif // wxUSE_MEMORY_DC_DRAW_RECTANGLE { wxDC::DoDrawRectangle(x, y, width, height); } -#else - wxDC::DoDrawRectangle(x, y, width, height); -#endif }