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:
@@ -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_
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -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__
|
||||||
|
Reference in New Issue
Block a user