]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/winuniv.cpp
Applied patch [ 583922 ] Make generic/wxListCtrl avail. in WIN32
[wxWidgets.git] / src / univ / winuniv.cpp
index be8a2ba4e3a23759b05a3eb0ac38d1b886558de7..f2b90368df6acb78ba879dde8507b7212fd8ddad 100644 (file)
@@ -180,39 +180,6 @@ const wxBitmap& wxWindow::GetBackgroundBitmap(int *alignment,
 // painting
 // ----------------------------------------------------------------------------
 
-// the event handler executed when the window background must be painted
-void wxWindow::OnErase(wxEraseEvent& event)
-{
-    if ( !m_renderer )
-    {
-        event.Skip();
-
-        return;
-    }
-    
-    DoDrawBackground(*event.GetDC());
-
-    // if we have both scrollbars, we also have a square in the corner between
-    // them which we must paint
-    if ( m_scrollbarVert && m_scrollbarHorz )
-    {
-        wxSize size = GetSize();
-        wxRect rectClient = GetClientRect(),
-               rectBorder = m_renderer->GetBorderDimensions(GetBorder());
-
-        wxRect rectCorner;
-        rectCorner.x = rectClient.GetRight() + 1;
-        rectCorner.y = rectClient.GetBottom() + 1;
-        rectCorner.SetRight(size.x - rectBorder.width);
-        rectCorner.SetBottom(size.y - rectBorder.height);
-
-        if ( GetUpdateRegion().Contains(rectCorner) )
-        {
-            m_renderer->DrawScrollCorner(*event.GetDC(), rectCorner);
-        }
-    }
-}
-
 // the event handlers executed when the window must be repainted
 void wxWindow::OnNcPaint(wxPaintEvent& event)
 {
@@ -263,43 +230,97 @@ void wxWindow::OnPaint(wxPaintEvent& event)
     }
 }
 
+// the event handler executed when the window background must be painted
+void wxWindow::OnErase(wxEraseEvent& event)
+{
+    if ( !m_renderer )
+    {
+        event.Skip();
+
+        return;
+    }
+    
+    DoDrawBackground(*event.GetDC());
+
+    // if we have both scrollbars, we also have a square in the corner between
+    // them which we must paint
+    if ( m_scrollbarVert && m_scrollbarHorz )
+    {
+        wxSize size = GetSize();
+        wxRect rectClient = GetClientRect(),
+               rectBorder = m_renderer->GetBorderDimensions(GetBorder());
+
+        wxRect rectCorner;
+        rectCorner.x = rectClient.GetRight() + 1;
+        rectCorner.y = rectClient.GetBottom() + 1;
+        rectCorner.SetRight(size.x - rectBorder.width);
+        rectCorner.SetBottom(size.y - rectBorder.height);
+
+        if ( GetUpdateRegion().Contains(rectCorner) )
+        {
+            m_renderer->DrawScrollCorner(*event.GetDC(), rectCorner);
+        }
+    }
+}
+
 bool wxWindow::DoDrawBackground(wxDC& dc)
 {
-    // FIXME: leaving this code in leads to partial bg redraws sometimes under
-    //        MSW
     wxRect rect;
-#ifndef __WXMSW__
-    rect = GetUpdateRegion().GetBox();
-    if ( !rect.width && !rect.height )
-#endif
+    
+    wxSize size = GetSize();  // Why not GetClientSize() ?
+    rect.x = 0;
+    rect.y = 0;
+    rect.width = size.x;
+    rect.height = size.y;
+    
+    if (HasTransparentBackground() && GetParent() && GetParent()->ProvidesBackground())
     {
-        wxSize size = GetSize();
-        rect.width = size.x;
-        rect.height = size.y;
+        wxASSERT( !IsTopLevel() );
+    
+        wxPoint pos = GetPosition();
+        
+        AdjustForParentClientOrigin( pos.x, pos.y, 0 );
+        
+        // Adjust DC logical origin
+        wxCoord x,y;
+        dc.GetLogicalOrigin( &x, &y );
+        x += pos.x;
+        y += pos.y;
+        dc.SetLogicalOrigin( x, y );
+        
+        // Adjust draw rect
+        rect.x = pos.x;
+        rect.y = pos.y;
+        
+        // Let parent draw the background
+        GetParent()->EraseBackground( dc, rect );
+    }
+    else
+    {
+        // Draw background ouselves
+         EraseBackground( dc, rect );
     }
+    
+    return TRUE;
+}
 
+void wxWindow::EraseBackground(wxDC& dc, const wxRect& rect)
+{
     if ( GetBackgroundBitmap().Ok() )
     {
-        // get the bitmap and the flags
+        // Get the bitmap and the flags
         int alignment;
         wxStretch stretch;
         wxBitmap bmp = GetBackgroundBitmap(&alignment, &stretch);
         wxControlRenderer::DrawBitmap(dc, bmp, rect, alignment, stretch);
     }
-    else // just fill it with bg colour if no bitmap
+    else 
     {
+        // Just fill it with bg colour if no bitmap
+    
         m_renderer->DrawBackground(dc, wxTHEME_BG_COLOUR(this),
                                    rect, GetStateFlags());
     }
-
-    return TRUE;
-}
-
-void wxWindow::EraseBackground(wxDC& dc, const wxRect& rect)
-{
-    // TODO: handle bg bitmaps here!
-
-    m_renderer->DrawBackground(dc, wxTHEME_BG_COLOUR(this), rect, GetStateFlags());
 }
 
 void wxWindow::DoDrawBorder(wxDC& dc, const wxRect& rect)
@@ -843,8 +864,12 @@ void wxWindow::SetScrollbar(int orient,
     // give the window a chance to relayout
     if ( hasClientSizeChanged )
     {
+#if wxUSE_TWO_WINDOWS
+        wxWindowNative::SetSize( GetSize() );
+#else
         wxSizeEvent event(GetSize());
         (void)GetEventHandler()->ProcessEvent(event);
+#endif
     }
 }