]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/dcclient.cpp
supporting events also for root control (needed for event handling of mouse and paint...
[wxWidgets.git] / src / mgl / dcclient.cpp
index 8edae04c3b05fecff9dd1ab4ae01a8d0cad90f73..d238dbc95cb9d8edf207b11d994b0db4bf4fa724 100644 (file)
@@ -3,11 +3,11 @@
 // Purpose:
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
 // Purpose:
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
-// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "dcclient.h"
 #endif
 
 #pragma implementation "dcclient.h"
 #endif
 
@@ -32,15 +32,24 @@ IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
 wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win)
 {
     MGLDevCtx *dc = win->GetPaintMGLDC();
 wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win)
 {
     MGLDevCtx *dc = win->GetPaintMGLDC();
+
     if ( dc )
     {
         m_inPaintHandler = TRUE;
     if ( dc )
     {
         m_inPaintHandler = TRUE;
+
+        m_globalClippingRegion = win->GetUpdateRegion();
         SetMGLDC(dc, FALSE);
     }
     else
     {
         m_inPaintHandler = FALSE;
         SetMGLDC(dc, FALSE);
     }
     else
     {
         m_inPaintHandler = FALSE;
-        SetMGLDC(new MGLDevCtx(MGL_wmBeginPaint(m_wnd->GetHandle())), TRUE);
+        
+        dc = new MGLDevCtx(MGL_wmBeginPaint(win->GetHandle()));
+
+        MGLRegion clip;
+        dc->getClipRegion(clip);
+        m_globalClippingRegion = wxRegion(clip);
+        SetMGLDC(dc, 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()
         // TRUE means that dtor will delete MGLDevCtx object
         // but it won't destroy MGLDC returned by MGL_wmBeginPaint because
         // ~MGLDevCtx() doesn't call destroy()
@@ -49,14 +58,7 @@ wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win)
 
 wxWindowDC::~wxWindowDC()
 {
 
 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
+    if ( !m_inPaintHandler )
     {
         GetMGLDC()->setDC(NULL);
         MGL_wmEndPaint(m_wnd->GetHandle());
     {
         GetMGLDC()->setDC(NULL);
         MGL_wmEndPaint(m_wnd->GetHandle());
@@ -66,6 +68,7 @@ wxWindowDC::~wxWindowDC()
 wxClientDC::wxClientDC(wxWindow *win) : wxWindowDC(win)
 {
     wxRect r = m_wnd->GetClientRect();
 wxClientDC::wxClientDC(wxWindow *win) : wxWindowDC(win)
 {
     wxRect r = m_wnd->GetClientRect();
-    SetClippingRegion(r);
+    m_globalClippingRegion.Intersect(r);
+    SetClippingRegion(m_globalClippingRegion);
     SetDeviceOrigin(r.x, r.y);
 }
     SetDeviceOrigin(r.x, r.y);
 }