+void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
+{
+ // standard non top level controls (i.e. except the dialogs) always erase
+ // their background themselves in HandleCtlColor() or have some control-
+ // specific ways to set the colours (common controls)
+ if ( IsOfStandardClass() && !IsTopLevel() )
+ {
+ event.Skip();
+ return;
+ }
+
+ if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+ {
+ // don't skip the event here, custom background means that the app
+ // is drawing it itself in its OnPaint(), so don't draw it at all
+ // now to avoid flicker
+ return;
+ }
+
+
+ // do default background painting
+ if ( !DoEraseBackground(*event.GetDC()) )
+ {
+ // let the system paint the background
+ event.Skip();
+ }
+}
+
+bool wxWindowMSW::DoEraseBackground(wxDC& dc)
+{
+ HBRUSH hBrush = (HBRUSH)MSWGetBgBrush(dc.GetHDC());
+ if ( !hBrush )
+ return false;
+
+ RECT rc;
+ ::GetClientRect(GetHwnd(), &rc);
+ ::FillRect(GetHdcOf(dc), &rc, hBrush);
+
+ return true;
+}
+
+WXHBRUSH wxWindowMSW::MSWGetSolidBgBrushForChild(wxWindow *child)
+{
+ wxColour col = MSWGetBgColourForChild(child);
+ if ( col.Ok() )
+ {
+ // draw children with the same colour as the parent
+ wxBrush *brush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
+
+ return (WXHBRUSH)brush->GetResourceHandle();
+ }
+
+ return 0;
+}
+
+wxColour wxWindowMSW::MSWGetBgColourForChild(wxWindow *child)
+{
+ if ( m_hasBgCol )
+ {
+ // our background colour applies to:
+ // 1. this window itself, always
+ // 2. all children unless the colour is "not inheritable"
+ // 3. immediate transparent children which should show the same
+ // background as we do, but not for transparent grandchildren
+ // which use the background of their immediate parent instead
+ if ( m_inheritBgCol ||
+ child == this ||
+ (child->HasTransparentBackground() &&
+ child->GetParent() == this) )
+ {
+ return GetBackgroundColour();
+ }
+ }
+
+ return wxNullColour;
+}
+
+WXHBRUSH wxWindowMSW::MSWGetBgBrushForSelf(wxWindow *parent, WXHDC hDC)
+{
+ return parent->MSWGetBgBrushForChild(hDC, (wxWindow *)this);
+}
+
+WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC)
+{
+ for ( wxWindow *win = (wxWindow *)this; win; win = win->GetParent() )
+ {
+ WXHBRUSH hBrush = MSWGetBgBrushForSelf(win, hDC);
+ if ( hBrush )
+ return hBrush;
+
+ // background is not inherited beyond the windows which have their own
+ // fixed background such as top level windows and notebooks and for
+ // windows for which a custom colour had been explicitly set with
+ // SetOwnBackgroundColour() and so shouldn't affect its children
+ if ( win->ProvidesBackground() ||
+ (win->m_hasBgCol && !win->m_inheritBgCol) )
+ break;
+ }
+
+ return 0;
+}
+
+bool
+wxWindowMSW::MSWPrintChild(wxWindow * WXUNUSED(win),
+ WXWPARAM WXUNUSED(wParam),
+ WXLPARAM WXUNUSED(lParam))
+{
+ return false;
+}
+