X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8f7b34a878bbcb2f71a0c7694e2a3bec51460218..625cb8c0b1ac12f26265cae2c69d7f510de0edb1:/src/mgl/dcclient.cpp?ds=sidebyside diff --git a/src/mgl/dcclient.cpp b/src/mgl/dcclient.cpp index 61b986dd39..8edae04c3b 100644 --- a/src/mgl/dcclient.cpp +++ b/src/mgl/dcclient.cpp @@ -11,9 +11,61 @@ #pragma implementation "dcclient.h" #endif -#include "wx/dcclient.h" -#include "wx/dcmemory.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/window.h" +#endif + +#include IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) -IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC) IMPLEMENT_DYNAMIC_CLASS(wxClientDC,wxWindowDC) +IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC) + +wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win) +{ + MGLDevCtx *dc = win->GetPaintMGLDC(); + if ( dc ) + { + m_inPaintHandler = TRUE; + SetMGLDC(dc, FALSE); + } + else + { + m_inPaintHandler = FALSE; + SetMGLDC(new MGLDevCtx(MGL_wmBeginPaint(m_wnd->GetHandle())), TRUE); + // TRUE means that dtor will delete MGLDevCtx object + // but it won't destroy MGLDC returned by MGL_wmBeginPaint because + // ~MGLDevCtx() doesn't call destroy() + } +} + +wxWindowDC::~wxWindowDC() +{ + if ( m_inPaintHandler ) + { + // This is neccessary so that subsequently created wxPaintDCs won't get + // confused about clipping. Another reason is that the same MGL dc is reused + // for wxEraseEvent, wxNcPaintEvent and wxPaintEvent + DestroyClippingRegion(); + } + else + { + GetMGLDC()->setDC(NULL); + MGL_wmEndPaint(m_wnd->GetHandle()); + } +} + +wxClientDC::wxClientDC(wxWindow *win) : wxWindowDC(win) +{ + wxRect r = m_wnd->GetClientRect(); + SetClippingRegion(r); + SetDeviceOrigin(r.x, r.y); +}