X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4bbc9f720cbd99d7092e8944e671a6291068b13..bcd3d8d9e26e41615d26d457ba0e2b84b80a0356:/src/mgl/dcclient.cpp?ds=sidebyside diff --git a/src/mgl/dcclient.cpp b/src/mgl/dcclient.cpp index f3bef5fbd7..8edae04c3b 100644 --- a/src/mgl/dcclient.cpp +++ b/src/mgl/dcclient.cpp @@ -26,20 +26,41 @@ #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) { - MGLDC *dc = MGL_wmBeginPaint(m_wnd->GetHandle()); - SetMGLDC(new MGLDevCtx(dc), FALSE); - // FIXME_MGL -- correctly handle setting device origin and - // clipping regions + 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() { - MGL_wmEndPaint(m_wnd->GetHandle()); + 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)