height = 0;
// if our parent had prepared a defer window handle for us, use it
- HDWP hdwp = m_parent ? (HDWP)m_parent->m_hDWP : NULL;
+ wxWindowMSW *parent = GetParent();
+ HDWP hdwp = parent ? (HDWP)parent->m_hDWP : NULL;
if ( hdwp )
{
hdwp = ::DeferWindowPos(hdwp, GetHwnd(), NULL,
}
// hdwp must be updated as it may have been changed
- m_parent->m_hDWP = (WXHANDLE)hdwp;
+ parent->m_hDWP = (WXHANDLE)hdwp;
}
// otherwise (or if deferring failed) move the window in place immediately
{
wxLogLastError(_T("EndDeferWindowPos"));
}
-
- m_hDWP = NULL;
}
break;
#endif // __SMARTPHONE__
void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
{
- // standard controls always erase their background themselves (although the
- // user may try to override it in a derived class)
- if ( IsOfStandardClass() )
+ // 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;
// do default background painting
- wxDC& dc = *event.GetDC();
- HBRUSH hBrush = (HBRUSH)MSWGetBgBrush(dc.GetHDC());
- if ( hBrush )
- {
- RECT rc;
- ::GetClientRect(GetHwnd(), &rc);
- ::FillRect(GetHdcOf(dc), &rc, hBrush);
- }
- else
+ 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);
wxColour wxWindowMSW::MSWGetBgColourForChild(wxWindow *child)
{
- return m_inheritBgCol || (m_hasBgCol && child == this)
- ? GetBackgroundColour()
- : wxNullColour;
+ 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)