#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"
#endif
#include "wx/dcclient.h"
+#include "wx/log.h"
#include <windows.h>
#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 ++;
}
-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());
}
-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;
// 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++;
+ }
}
-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
+ }
}
+