simplifications and corrections to background drawing:

1. removed ApplyParentThemeBackground() not used any longer
2. removed ProvidesBackground() which is synonymous with
   !HasTransparentBackground()
3. removed a whole bunch of unused MSWXXX() methods
4. moved MSWControlColor() from wxWindow up to wxControl

results:

1. the gradient is still shown properly for static/radio boxes in notebooks
2. correct background colour is used for the static boxes
3. code is shorter and better commented


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33474 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2005-04-10 15:23:08 +00:00
parent 47561b0dc5
commit c3732409ac
32 changed files with 340 additions and 496 deletions

View File

@@ -2318,55 +2318,57 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l
processed = HandleKillFocus((WXHWND)(HWND)wParam);
break;
case WM_PAINT:
{
if ( wParam )
{
// cast to wxWindow is needed for wxUniv
wxPaintDCEx dc((wxWindow *)this, (WXHDC)wParam);
processed = HandlePaint();
}
else
{
processed = HandlePaint();
}
break;
}
#ifdef WM_PRINT
case WM_PRINTCLIENT:
if ( GetParent() &&
GetParent()->MSWPrintChild((wxWindow *)this, wParam, lParam) )
// we receive this message when DrawThemeParentBackground() is
// called from def window proc of several controls under XP and we
// must draw properly themed background here
//
// note that naively I'd expect filling the client rect with the
// brush returned by MSWGetBgBrush() work -- but for some reason it
// doesn't and we have to call parents MSWPrintChild() which is
// supposed to call DrawThemeBackground() with appropriate params
//
// also note that in this case lParam == PRF_CLIENT but we're
// clearly expected to paint the background and nothing else!
{
processed = true;
for ( wxWindow *win = GetParent(); win; win = win->GetParent() )
{
if ( win->MSWPrintChild((WXHDC)wParam, (wxWindow *)this) )
{
processed = true;
break;
}
if ( win->IsTopLevel() || win->InheritsBackgroundColour() )
break;
}
}
break;
case WM_PRINT:
case WM_PAINT:
if ( wParam )
{
if ( lParam & PRF_ERASEBKGND )
HandleEraseBkgnd((WXHDC)(HDC)wParam);
wxPaintDCEx dc((wxWindow *)this, (WXHDC)wParam);
processed = HandlePaint();
}
else // no DC given
{
processed = HandlePaint();
}
break;
#endif // WM_PRINT
case WM_CLOSE:
#ifdef __WXUNIVERSAL__
// Universal uses its own wxFrame/wxDialog, so we don't receive
// close events unless we have this.
Close();
processed = true;
rc.result = TRUE;
#else
#endif // __WXUNIVERSAL__
// don't let the DefWindowProc() destroy our window - we'll do it
// ourselves in ~wxWindow
processed = true;
rc.result = TRUE;
#endif
break;
case WM_SHOWWINDOW:
@@ -3708,7 +3710,8 @@ bool wxWindowMSW::HandleDisplayChange()
bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC pDC, WXHWND pWnd)
{
#if wxUSE_CONTROLS
wxWindow *item = FindItemByHWND(pWnd, true);
wxControl *item = wxDynamicCast(FindItemByHWND(pWnd, true), wxControl);
if ( item )
*brush = item->MSWControlColor(pDC);
else
@@ -3720,11 +3723,6 @@ bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC pDC, WXHWND pWnd)
#endif // __WXMICROWIN__
WXHBRUSH wxWindowMSW::MSWControlColor(WXHDC WXUNUSED(hDC))
{
return (WXHBRUSH)0;
}
bool wxWindowMSW::HandlePaletteChanged(WXHWND hWndPalChange)
{
#if wxUSE_PALETTE
@@ -3986,93 +3984,70 @@ void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
// do default background painting
if ( !DoEraseBackground(*event.GetDC()) )
if ( !DoEraseBackground(GetHdcOf(*event.GetDC())) )
{
// let the system paint the background
event.Skip();
}
}
bool wxWindowMSW::DoEraseBackground(wxDC& dc)
bool wxWindowMSW::DoEraseBackground(WXHDC hDC)
{
HBRUSH hBrush = (HBRUSH)MSWGetBgBrush(dc.GetHDC());
if ( !hBrush )
HBRUSH hbr = (HBRUSH)MSWGetBgBrush(hDC);
if ( !hbr )
return false;
RECT rc;
::GetClientRect(GetHwnd(), &rc);
::FillRect(GetHdcOf(dc), &rc, hBrush);
wxFillRect(GetHwnd(), (HDC)hDC, hbr);
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)
WXHBRUSH
wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), 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 ||
// 3. even if it is not inheritable, our immediate transparent
// children should still inherit it -- but not any transparent
// children because it would look wrong if a child of non
// transparent child would show our bg colour when the child itself
// does not
if ( child == this ||
m_inheritBgCol ||
(child->HasTransparentBackground() &&
child->GetParent() == this) )
{
return GetBackgroundColour();
// draw children with the same colour as the parent
wxBrush *
brush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour());
return (WXHBRUSH)GetHbrushOf(*brush);
}
}
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->UseBgCol() && !win->InheritsBackgroundColour()) )
break;
}
return 0;
}
bool
wxWindowMSW::MSWPrintChild(wxWindow * WXUNUSED(win),
WXWPARAM WXUNUSED(wParam),
WXLPARAM WXUNUSED(lParam))
WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC, wxWindow *winToPaint)
{
return false;
if ( !winToPaint )
winToPaint = this;
for ( wxWindowMSW *win = this; win; win = win->GetParent() )
{
WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, winToPaint);
if ( hBrush )
return hBrush;
// background is not inherited beyond top level windows
if ( win->IsTopLevel() )
break;
}
return 0;
}
// ---------------------------------------------------------------------------