1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxClientDC class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ===========================================================================
14 // ===========================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "dcclient.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
31 #include "wx/dcclient.h"
34 #include "wx/msw/private.h"
36 // ----------------------------------------------------------------------------
38 // ----------------------------------------------------------------------------
40 #if !USE_SHARED_LIBRARY
41 IMPLEMENT_DYNAMIC_CLASS(wxWindowDC
, wxDC
)
42 IMPLEMENT_DYNAMIC_CLASS(wxClientDC
, wxWindowDC
)
43 IMPLEMENT_DYNAMIC_CLASS(wxPaintDC
, wxWindowDC
)
46 // ----------------------------------------------------------------------------
48 // ----------------------------------------------------------------------------
50 static PAINTSTRUCT g_paintStruct
;
53 // a global variable which we check to verify that wxPaintDC are only
54 // created in resopnse to WM_PAINT message - doing this from elsewhere is a
55 // common programming error among wxWindows programmers and might lead to
56 // very subtle and difficult to debug refresh/repaint bugs.
57 extern bool g_isPainting
= FALSE
;
60 // ===========================================================================
62 // ===========================================================================
64 // ----------------------------------------------------------------------------
66 // ----------------------------------------------------------------------------
68 wxWindowDC::wxWindowDC()
73 wxWindowDC::wxWindowDC(wxWindow
*the_canvas
)
75 m_canvas
= the_canvas
;
76 m_hDC
= (WXHDC
) ::GetWindowDC(GetWinHwnd(the_canvas
) );
79 SetBackground(wxBrush(m_canvas
->GetBackgroundColour(), wxSOLID
));
82 wxWindowDC::~wxWindowDC()
84 if (m_canvas
&& m_hDC
)
86 SelectOldObjects(m_hDC
);
88 ::ReleaseDC(GetWinHwnd(m_canvas
), GetHdc());
95 // ----------------------------------------------------------------------------
97 // ----------------------------------------------------------------------------
99 wxClientDC::wxClientDC()
104 wxClientDC::wxClientDC(wxWindow
*the_canvas
)
106 m_canvas
= the_canvas
;
107 m_hDC
= (WXHDC
) ::GetDC(GetWinHwnd(the_canvas
));
109 SetBackground(wxBrush(m_canvas
->GetBackgroundColour(), wxSOLID
));
112 wxClientDC::~wxClientDC()
114 if ( m_canvas
&& GetHdc() )
116 SelectOldObjects(m_hDC
);
118 ::ReleaseDC(GetWinHwnd(m_canvas
), GetHdc());
123 // ----------------------------------------------------------------------------
125 // ----------------------------------------------------------------------------
127 // TODO (VZ) I have still some doubts about this hack and I still think that we
128 // should store pairs of (hwnd, hdc) and not just the DC - what if
129 // BeginPaint() was called on other window? It seems to work like
130 // this, but to be sure about it we'd need to store hwnd too...
132 WXHDC
wxPaintDC::ms_PaintHDC
= 0;
133 size_t wxPaintDC::ms_PaintCount
= 0; // count of ms_PaintHDC usage
135 wxPaintDC::wxPaintDC()
140 wxPaintDC::wxPaintDC(wxWindow
*canvas
)
142 wxCHECK_RET( canvas
, "NULL canvas in wxPaintDC ctor" );
143 wxCHECK_RET( g_isPainting
,
144 _T("wxPaintDC may be created only in EVT_PAINT handler!") );
148 // Don't call Begin/EndPaint if it's already been called: for example, if
149 // calling a base class OnPaint.
150 if ( ms_PaintCount
> 0 ) {
151 // it means that we've already called BeginPaint and so we must just
152 // reuse the same HDC (BeginPaint shouldn't be called more than once)
153 wxASSERT( ms_PaintHDC
);
160 m_hDC
= (WXHDC
)::BeginPaint((HWND
)m_canvas
->GetHWND(), &g_paintStruct
);
165 SetBackground(wxBrush(m_canvas
->GetBackgroundColour(), wxSOLID
));
168 wxPaintDC::~wxPaintDC()
171 if ( !--ms_PaintCount
) {
172 ::EndPaint((HWND
)m_canvas
->GetHWND(), &g_paintStruct
);
174 m_hDC
= (WXHDC
) NULL
;
175 ms_PaintHDC
= (WXHDC
) NULL
;
177 //else: ms_PaintHDC still in use