DECLARE_DYNAMIC_CLASS_NO_COPY(wxPaintDC)
};
+/*
+ * wxPaintDCEx
+ * This class is used when an application sends an HDC with the WM_PAINT
+ * message. It is used in HandlePaint and need not be used by an application.
+ */
+
+class WXDLLEXPORT wxPaintDCEx : public wxPaintDC
+{
+public:
+ wxPaintDCEx(wxWindow *canvas, WXHDC dc);
+ virtual ~wxPaintDCEx();
+private:
+ int saveState;
+
+ DECLARE_CLASS(wxPaintDCEx)
+ DECLARE_NO_COPY_CLASS(wxPaintDCEx)
+};
+
#endif
// _WX_DCCLIENT_H_
#endif // wxUSE_DBGHELP
-bool wxCrashReportImpl::Generate(int flags)
+// Remove warning
+#if wxUSE_DBGHELP
+#define _WXUNUSED(x) x
+#else
+#define _WXUNUSED WXUNUSED
+#endif
+
+bool wxCrashReportImpl::Generate(int _WXUNUSED(flags))
{
if ( m_hFile == INVALID_HANDLE_VALUE )
return false;
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
+IMPLEMENT_CLASS(wxPaintDCEx, wxPaintDC)
// ----------------------------------------------------------------------------
// global variables
return 0;
}
+/*
+ * wxPaintDCEx
+ */
+
+wxPaintDCEx::wxPaintDCEx(wxWindow *canvas, WXHDC dc) : saveState(0)
+{
+#ifdef __WXDEBUG__
+ if ( !dc )
+ {
+ wxFAIL_MSG( wxT("wxPaintDCEx requires an existing device context") );
+ return;
+ }
+#endif // __WXDEBUG__
+
+ m_canvas = canvas;
+
+ wxPaintDCInfo *info = FindInCache();
+ if ( info )
+ {
+ m_hDC = info->hdc;
+ info->count++;
+ }
+ else // not in cache, create a new one
+ {
+ m_hDC = dc;
+ ms_cache.Add(new wxPaintDCInfo(m_canvas, this));
+ saveState = SaveDC((HDC) dc);
+ }
+}
+
+wxPaintDCEx::~wxPaintDCEx()
+{
+ size_t index;
+ wxPaintDCInfo *info = FindInCache(&index);
+
+ wxCHECK_RET( info, wxT("existing DC should have a cache entry") );
+
+ if ( !--info->count )
+ {
+ RestoreDC((HDC) m_hDC, saveState);
+ ms_cache.RemoveAt(index);
+
+ // Reduce the number of bogus reports of non-freed memory
+ // at app exit
+ if (ms_cache.IsEmpty())
+ ms_cache.Clear();
+ }
+ //else: cached DC entry is still in use
+
+ // prevent the base class dtor from ReleaseDC()ing it again
+ m_hDC = 0;
+}
+