// Modified by:
// Created: 01/02/97
// RCS-ID: $Id$
-// Copyright: (c) Julian Smart and Markus Holzem
+// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "dcclient.h"
#endif
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
+IMPLEMENT_CLASS(wxPaintDCEx, wxPaintDC)
// ----------------------------------------------------------------------------
// global variables
// default bg colour is pne of the window
SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
+
+ // since we are a window dc we need to grab the palette from the window
+#if wxUSE_PALETTE
+ InitializePalette();
+#endif
+}
+
+void wxWindowDC::DoGetSize(int *width, int *height) const
+{
+ wxCHECK_RET( m_canvas, _T("wxWindowDC without a window?") );
+
+ m_canvas->GetSize(width, height);
}
// ----------------------------------------------------------------------------
{
}
+void wxClientDC::DoGetSize(int *width, int *height) const
+{
+ wxCHECK_RET( m_canvas, _T("wxClientDC without a window?") );
+
+ m_canvas->GetClientSize(width, height);
+}
+
// ----------------------------------------------------------------------------
// wxPaintDC
// ----------------------------------------------------------------------------
size_t nCache = ms_cache.GetCount();
for ( size_t n = 0; n < nCache; n++ )
{
- info = &ms_cache[n];
- if ( info->hwnd == m_canvas->GetHWND() )
+ wxPaintDCInfo *info1 = &ms_cache[n];
+ if ( info1->hwnd == m_canvas->GetHWND() )
{
+ info = info1;
if ( index )
*index = n;
break;
// find the entry for this DC in the cache (keyed by the window)
WXHDC wxPaintDC::FindDCInCache(wxWindow* win)
{
- wxPaintDCInfo *info = NULL;
size_t nCache = ms_cache.GetCount();
for ( size_t n = 0; n < nCache; n++ )
{
- info = &ms_cache[n];
+ wxPaintDCInfo *info = &ms_cache[n];
if ( info->hwnd == win->GetHWND() )
{
return info->hdc;
return 0;
}
+/*
+ * wxPaintDCEx
+ */
+
+// TODO: don't duplicate wxPaintDC code here!!
+
+wxPaintDCEx::wxPaintDCEx(wxWindow *canvas, WXHDC dc) : saveState(0)
+{
+ wxCHECK_RET( dc, wxT("wxPaintDCEx requires an existing device context") );
+
+ 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;
+}
+