X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..8998887c224924d5f6f4601597c162d6429495e1:/src/msw/dcmemory.cpp diff --git a/src/msw/dcmemory.cpp b/src/msw/dcmemory.cpp index cb5a8a8abc..f93d3b7962 100644 --- a/src/msw/dcmemory.cpp +++ b/src/msw/dcmemory.cpp @@ -5,7 +5,7 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dcmemory.h" #endif @@ -53,37 +53,47 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC) wxMemoryDC::wxMemoryDC() { - m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) NULL); - m_ok = (m_hDC != 0); - m_bOwnsDC = TRUE; + CreateCompatible(NULL); - 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 ); + Init(); } -wxMemoryDC::wxMemoryDC(wxDC *old_dc) +wxMemoryDC::wxMemoryDC(wxDC *dc) { - old_dc->BeginDrawing(); + wxCHECK_RET( dc, _T("NULL dc in wxMemoryDC ctor") ); + + dc->BeginDrawing(); + + CreateCompatible(dc); - m_hDC = (WXHDC) ::CreateCompatibleDC(GetHdcOf(*old_dc)); - m_ok = (m_hDC != 0); + dc->EndDrawing(); - old_dc->EndDrawing(); + Init(); +} - SetBrush(*wxWHITE_BRUSH); - SetPen(*wxBLACK_PEN); +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 ); + // the background mode is only used for text background and is set in + // DrawText() to OPAQUE as required, otherwise always TRANSPARENT + ::SetBkMode( GetHdc(), TRANSPARENT ); + } } -wxMemoryDC::~wxMemoryDC() +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) @@ -94,22 +104,26 @@ void wxMemoryDC::SelectObject(const wxBitmap& bitmap) ::SelectObject(GetHdc(), (HBITMAP) m_oldBitmap); if ( m_selectedBitmap.Ok() ) { +#ifdef __WXDEBUG__ m_selectedBitmap.SetSelectedInto(NULL); +#endif m_selectedBitmap = wxNullBitmap; } } // 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)") ); + wxASSERT_MSG( !bitmap.GetSelectedInto() || + (bitmap.GetSelectedInto() == this), + wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") ); m_selectedBitmap = bitmap; WXHBITMAP hBmp = m_selectedBitmap.GetHBITMAP(); if ( !hBmp ) return; +#ifdef __WXDEBUG__ m_selectedBitmap.SetSelectedInto(this); +#endif hBmp = (WXHBITMAP)::SelectObject(GetHdc(), (HBITMAP)hBmp); if ( !hBmp )