]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxPaintDCEx class, to handle the case where an HDC
authorJulian Smart <julian@anthemion.co.uk>
Tue, 29 Jul 2003 14:27:18 +0000 (14:27 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Tue, 29 Jul 2003 14:27:18 +0000 (14:27 +0000)
is passed with WM_PAINT. Apps that want to can have their
own HDC painted on.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22367 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/dcclient.h
src/msw/crashrpt.cpp
src/msw/dcclient.cpp
src/msw/window.cpp

index 48ee0851d09d344445cfa477b85a38411040f498..bad4cf72f28c326d113305bad6649e38a8c1f668 100644 (file)
@@ -100,5 +100,23 @@ private:
     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_
index eaccaeafce071e502f1658973620e4d655164212..9ddcf4902935b92737092a9ee989174e98f26a94 100644 (file)
@@ -997,7 +997,14 @@ wxString wxCrashReportImpl::GetExceptionString(DWORD dwCode)
 
 #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;
index c03897cf2a6cdd54b98011a271fa377fd4028d29..748fe83850e88f6db51901b0f21ec5b8d7fcfc22 100644 (file)
@@ -65,6 +65,7 @@ WX_DEFINE_OBJARRAY(wxArrayDCInfo);
 IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
 IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
 IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
+IMPLEMENT_CLASS(wxPaintDCEx, wxPaintDC)
 
 // ----------------------------------------------------------------------------
 // global variables
@@ -305,3 +306,56 @@ WXHDC wxPaintDC::FindDCInCache(wxWindow* win)
     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;
+}
+
index e17c2ef59eed7bb11e84485cfffa4dd7abdbd97c..a9f4e8312e3e79235a3d16a45b5c6ffc368fe3f9 100644 (file)
@@ -2344,8 +2344,17 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
             break;
 
         case WM_PAINT:
-            processed = HandlePaint();
-            break;
+            {
+                wxPaintDCEx *pdc = 0;
+                if (wParam) {
+                    pdc = new wxPaintDCEx(this, (WXHDC) wParam);
+                }
+                processed = HandlePaint();
+                if (pdc) {
+                    delete pdc;
+                }
+                break;
+            }
 
         case WM_CLOSE:
 #ifdef __WXUNIVERSAL__