+// ----------------------------------------------------------------------------
+// wxPaintDC
+// ----------------------------------------------------------------------------
+
+// VZ: initial implementation (by JACS) only remembered the last wxPaintDC
+// created and tried to reuse it - this was supposed to take care of a
+// situation when a derived class OnPaint() calls base class OnPaint()
+// because in this case ::BeginPaint() shouldn't be called second time.
+//
+// I'm not sure how useful this is, however we must remember the HWND
+// associated with the last HDC as well - otherwise we may (and will!) try
+// to reuse the HDC for another HWND which is a nice recipe for disaster.
+//
+// So we store a list of windows for which we already have the DC and not
+// just one single hDC. This seems to work, but I'm really not sure about
+// the usefullness of the whole idea - IMHO it's much better to not call
+// base class OnPaint() at all, or, if we really want to allow it, add a
+// "wxPaintDC *" parameter to wxPaintEvent which should be used if it's
+// !NULL instead of creating a new DC.
+
+wxArrayDCInfo wxPaintDC::ms_cache;
+
+wxPaintDC::wxPaintDC()
+{
+ m_canvas = NULL;
+}
+
+wxPaintDC::wxPaintDC(wxWindow *canvas)
+{
+ wxCHECK_RET( canvas, wxT("NULL canvas in wxPaintDC ctor") );
+
+#ifdef __WXDEBUG__
+ if ( g_isPainting <= 0 )
+ {
+ wxFAIL_MSG( wxT("wxPaintDC may be created only in EVT_PAINT handler!") );
+
+ return;
+ }
+#endif // __WXDEBUG__
+
+ m_canvas = canvas;
+
+ // do we have a DC for this window in the cache?
+ wxPaintDCInfo *info = FindInCache();
+ if ( info )
+ {
+ m_hDC = info->hdc;
+ info->count++;
+ }
+ else // not in cache, create a new one
+ {
+ m_hDC = (WXHDC)::BeginPaint(GetHwndOf(m_canvas), &g_paintStruct);
+ if (m_hDC)
+ ms_cache.Add(new wxPaintDCInfo(m_canvas, this));
+ }
+
+ // (re)set the DC parameters.
+ // Note: at this point m_hDC can be NULL under MicroWindows, when dragging.
+ if (GetHDC())
+ InitDC();
+}
+
+wxPaintDC::~wxPaintDC()
+{
+ if ( m_hDC )
+ {
+ SelectOldObjects(m_hDC);