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:
parent
276a125640
commit
c6151f2a94
@ -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_
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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__
|
||||
|
Loading…
Reference in New Issue
Block a user