Added wxPaintDCEx class, to handle the case where an HDC

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
This commit is contained in:
Julian Smart
2003-07-29 14:27:18 +00:00
parent 276a125640
commit c6151f2a94
4 changed files with 91 additions and 3 deletions

View File

@@ -100,5 +100,23 @@ private:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxPaintDC) 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 #endif
// _WX_DCCLIENT_H_ // _WX_DCCLIENT_H_

View File

@@ -997,7 +997,14 @@ wxString wxCrashReportImpl::GetExceptionString(DWORD dwCode)
#endif // wxUSE_DBGHELP #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 ) if ( m_hFile == INVALID_HANDLE_VALUE )
return false; return false;

View File

@@ -65,6 +65,7 @@ WX_DEFINE_OBJARRAY(wxArrayDCInfo);
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC) IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
IMPLEMENT_CLASS(wxPaintDCEx, wxPaintDC)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// global variables // global variables
@@ -305,3 +306,56 @@ WXHDC wxPaintDC::FindDCInCache(wxWindow* win)
return 0; 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;
}

View File

@@ -2344,8 +2344,17 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
break; break;
case WM_PAINT: case WM_PAINT:
{
wxPaintDCEx *pdc = 0;
if (wParam) {
pdc = new wxPaintDCEx(this, (WXHDC) wParam);
}
processed = HandlePaint(); processed = HandlePaint();
if (pdc) {
delete pdc;
}
break; break;
}
case WM_CLOSE: case WM_CLOSE:
#ifdef __WXUNIVERSAL__ #ifdef __WXUNIVERSAL__