X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c089c47f344926e2f95a8aa342992ed844fe609..1a787c5dc89b1cb6a9ddb4ebef3ad2fb24b49c8c:/src/msw/dcmemory.cpp diff --git a/src/msw/dcmemory.cpp b/src/msw/dcmemory.cpp index 34920234b1..1a59e06627 100644 --- a/src/msw/dcmemory.cpp +++ b/src/msw/dcmemory.cpp @@ -6,112 +6,136 @@ // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation -#pragma implementation "dcmemory.h" + #pragma implementation "dcmemory.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/log.h" #endif +#include "wx/msw/private.h" + #include "wx/dcmemory.h" -#include +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC) -#endif + IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC) + +// ============================================================================ +// implementation +// ============================================================================ -/* - * Memory DC - * - */ +// ---------------------------------------------------------------------------- +// wxMemoryDC +// ---------------------------------------------------------------------------- -wxMemoryDC::wxMemoryDC(void) +wxMemoryDC::wxMemoryDC() { - m_hDC = (WXHDC) ::CreateCompatibleDC(NULL); - m_ok = (m_hDC != 0); - m_bOwnsDC = TRUE; + m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) NULL); + m_ok = (m_hDC != 0); + m_bOwnsDC = TRUE; + + SetBrush(*wxWHITE_BRUSH); + SetPen(*wxBLACK_PEN); - 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 ); } wxMemoryDC::wxMemoryDC(wxDC *old_dc) { - old_dc->BeginDrawing(); + old_dc->BeginDrawing(); - m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) old_dc->GetHDC()); - m_ok = (m_hDC != 0); + m_hDC = (WXHDC) ::CreateCompatibleDC(GetHdcOf(*old_dc)); + m_ok = (m_hDC != 0); - old_dc->EndDrawing(); + old_dc->EndDrawing(); - SetBrush(*wxWHITE_BRUSH); - SetPen(*wxBLACK_PEN); + 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 ); } -wxMemoryDC::~wxMemoryDC(void) +wxMemoryDC::~wxMemoryDC() { } void wxMemoryDC::SelectObject(const wxBitmap& bitmap) { - // Select old bitmap out of the device context - if (m_oldBitmap) - { - ::SelectObject((HDC) m_hDC, (HBITMAP) m_oldBitmap); - if (m_selectedBitmap.Ok()) + // select old bitmap out of the device context + if ( m_oldBitmap ) { - m_selectedBitmap.SetSelectedInto(NULL); - m_selectedBitmap = wxNullBitmap; + ::SelectObject(GetHdc(), (HBITMAP) m_oldBitmap); + if ( m_selectedBitmap.Ok() ) + { + m_selectedBitmap.SetSelectedInto(NULL); + 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)") ); + + m_selectedBitmap = bitmap; + WXHBITMAP hBmp = m_selectedBitmap.GetHBITMAP(); + if ( !hBmp ) + return; + + m_selectedBitmap.SetSelectedInto(this); + hBmp = (WXHBITMAP)::SelectObject(GetHdc(), (HBITMAP)hBmp); + + if ( !hBmp ) + { + wxLogLastError("SelectObject(memDC, bitmap)"); + + wxFAIL_MSG(wxT("Couldn't select a bitmap into wxMemoryDC")); + } + else if ( !m_oldBitmap ) + { + m_oldBitmap = hBmp; } - } - - // Do own check for whether the bitmap is already selected into - // a device context - if (bitmap.GetSelectedInto() && (bitmap.GetSelectedInto() != this)) - { - wxFatalError("Error in wxMemoryDC::SelectObject\nBitmap is selected in another wxMemoryDC.\nDelete the first wxMemoryDC or use SelectObject(NULL)"); - return; - } - - m_selectedBitmap = bitmap; - - if (!m_selectedBitmap.Ok()) - return; - - m_selectedBitmap.SetSelectedInto(this); -#if DEBUG > 1 - wxDebugMsg("wxMemoryDC::SelectObject: Selecting HBITMAP %X\n", m_selectedBitmap.GetHBITMAP()); -#endif - HBITMAP bm = ::SelectObject((HDC) m_hDC, (HBITMAP) m_selectedBitmap.GetHBITMAP()); - - if (bm == ERROR) - { - wxFatalError("Error in wxMemoryDC::SelectObject\nBitmap may not be loaded, or may be selected in another wxMemoryDC.\nDelete the first wxMemoryDC to deselect bitmap."); - } - else if (!m_oldBitmap) - m_oldBitmap = (WXHBITMAP) bm; } -void wxMemoryDC::GetSize(int *width, int *height) const +void wxMemoryDC::DoGetSize(int *width, int *height) const { - if (!m_selectedBitmap.Ok()) - { - *width = 0; *height = 0; - return; - } - *width = m_selectedBitmap.GetWidth(); - *height = m_selectedBitmap.GetHeight(); + if ( m_selectedBitmap.Ok() ) + { + *width = m_selectedBitmap.GetWidth(); + *height = m_selectedBitmap.GetHeight(); + } + else + { + *width = 0; + *height = 0; + } }