X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c089c47f344926e2f95a8aa342992ed844fe609..9a48c2ba3dc319c2cea520ca9ac54d2081362a39:/src/msw/dcclient.cpp diff --git a/src/msw/dcclient.cpp b/src/msw/dcclient.cpp index 3288e3641b..50fd1ad86e 100644 --- a/src/msw/dcclient.cpp +++ b/src/msw/dcclient.cpp @@ -13,11 +13,6 @@ #pragma implementation "dcclient.h" #endif -#ifdef __GNUG__ -#pragma implementation -#pragma implementation "dcclient.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -29,65 +24,82 @@ #endif #include "wx/dcclient.h" +#include "wx/log.h" #include #if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxDC) IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) -IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxDC) +IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) +IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) #endif -wxClientDC::wxClientDC(void) +/* + * wxWindowDC + */ + +wxWindowDC::wxWindowDC(void) { m_canvas = NULL; } -wxClientDC::wxClientDC(wxWindow *the_canvas) +wxWindowDC::wxWindowDC(wxWindow *the_canvas) { m_canvas = the_canvas; -// BeginDrawing(); - m_hDC = (WXHDC) ::GetDC((HWND) the_canvas->GetHWND()); +// m_hDC = (WXHDC) ::GetDCEx((HWND) the_canvas->GetHWND(), NULL, DCX_WINDOW); + m_hDC = (WXHDC) ::GetWindowDC((HWND) the_canvas->GetHWND() ); + m_hDCCount ++; + + SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); } -wxClientDC::~wxClientDC(void) +wxWindowDC::~wxWindowDC(void) { -// EndDrawing(); - - if (m_canvas && (HDC) m_hDC) + if (m_canvas && m_hDC) { SelectOldObjects(m_hDC); ::ReleaseDC((HWND) m_canvas->GetHWND(), (HDC) m_hDC); m_hDC = 0; } + m_hDCCount --; } -wxWindowDC::wxWindowDC(void) +/* + * wxClientDC + */ + +wxClientDC::wxClientDC(void) { m_canvas = NULL; } -wxWindowDC::wxWindowDC(wxWindow *the_canvas) +wxClientDC::wxClientDC(wxWindow *the_canvas) { m_canvas = the_canvas; -// m_hDC = (WXHDC) ::GetDCEx((HWND) the_canvas->GetHWND(), NULL, DCX_WINDOW); - m_hDC = (WXHDC) ::GetWindowDC((HWND) the_canvas->GetHWND() ); - m_hDCCount ++; +// BeginDrawing(); + m_hDC = (WXHDC) ::GetDC((HWND) the_canvas->GetHWND()); + + SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); } -wxWindowDC::~wxWindowDC(void) +wxClientDC::~wxClientDC(void) { - if (m_canvas && m_hDC) +// EndDrawing(); + + if (m_canvas && (HDC) m_hDC) { SelectOldObjects(m_hDC); ::ReleaseDC((HWND) m_canvas->GetHWND(), (HDC) m_hDC); m_hDC = 0; } - m_hDCCount --; } +/* + * wxPaintDC + */ + wxPaintDC::wxPaintDC(void) { m_canvas = NULL; @@ -98,54 +110,42 @@ static PAINTSTRUCT g_paintStruct; // Don't call Begin/EndPaint if it's already been called: // for example, if calling a base class OnPaint. -WXHDC wxPaintDC::m_staticPaintHDC = 0; -int wxPaintDC::m_staticPaintCount = 0; +WXHDC wxPaintDC::ms_PaintHDC = 0; +size_t wxPaintDC::ms_PaintCount = 0; // count of ms_PaintHDC usage -wxPaintDC::wxPaintDC(wxWindow *the_canvas) +wxPaintDC::wxPaintDC(wxWindow *canvas) { - if ( the_canvas && (m_staticPaintCount == 0)) - { - m_hDC = (WXHDC) ::BeginPaint((HWND) the_canvas->GetHWND(), &g_paintStruct); - m_hDCCount ++; - m_staticPaintCount ++ ; - m_staticPaintHDC = m_hDC ; - } - else - { - wxDebugMsg("wxPaintDC: Using existing HDC\n"); - m_hDC = m_staticPaintHDC ; - } + wxCHECK_RET( canvas, "NULL canvas in wxPaintDC ctor" ); - m_canvas = the_canvas; - RECT updateRect1 = g_paintStruct.rcPaint; - m_canvas->m_updateRect.x = updateRect1.left; - m_canvas->m_updateRect.y = updateRect1.top; - m_canvas->m_updateRect.width = updateRect1.right - updateRect1.left; - m_canvas->m_updateRect.height = updateRect1.bottom - updateRect1.top; -// m_canvas->m_paintHDC = m_staticPaintHDC ; + m_canvas = canvas; + if ( ms_PaintCount > 0 ) { + // it means that we've already called BeginPaint and so we must just + // reuse the same HDC (BeginPaint shouldn't be called more than once) + wxASSERT( ms_PaintHDC ); + + m_hDC = ms_PaintHDC; + ms_PaintCount++; + } + else { + ms_PaintHDC = + m_hDC = (WXHDC)::BeginPaint((HWND)m_canvas->GetHWND(), &g_paintStruct); + ms_PaintCount = 1; + m_hDCCount++; + } + + SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); } -wxPaintDC::~wxPaintDC(void) +wxPaintDC::~wxPaintDC() { - m_staticPaintCount -- ; - - if (m_staticPaintCount == 0) - { -// m_canvas->m_paintHDC = 0; - - if ( m_hDC && m_canvas) - { - ::EndPaint((HWND) m_canvas->GetHWND(), &g_paintStruct); - m_hDCCount --; - m_hDC = 0; - } - else - wxDebugMsg("~wxPaintDC: Did not release HDC\n"); - - m_staticPaintHDC = 0 ; - } - else - { - wxDebugMsg("~wxPaintDC: Did not release HDC\n"); + if ( m_hDC ) { + if ( !--ms_PaintCount ) { + ::EndPaint((HWND)m_canvas->GetHWND(), &g_paintStruct); + m_hDCCount--; + m_hDC = (WXHDC) NULL; + ms_PaintHDC = (WXHDC) NULL; } + else { }//: ms_PaintHDC still in use + } } +