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

@@ -180,25 +180,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookPageInfo, wxObject )
#endif
IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
// ----------------------------------------------------------------------------
// local functions
// ----------------------------------------------------------------------------
#ifndef __WXWINCE__
// apparently DrawThemeBackground() modifies the rect passed to it and if we
// don't call this function there are some drawing artifacts which are only
// visible with some non default themes; so modify the rect here so that it
// still paints the correct area
static void AdjustRectForThemeBg(RECT& rc)
{
// magic numbers needed to compensate for DrawThemeBackground()
rc.left -= 2;
rc.top -= 2;
rc.right += 4;
rc.bottom += 5;
}
#endif
// ============================================================================
// implementation
// ============================================================================
@@ -264,7 +245,7 @@ bool wxNotebook::Create(wxWindow *parent,
if (style & wxNB_FLAT)
style |= wxBORDER_SUNKEN;
#endif
// comctl32.dll 6.0 doesn't support non-top tabs with visual styles (the
// control is simply not rendered correctly), so disable them in this case
const int verComCtl32 = wxApp::GetComCtl32Version();
@@ -361,7 +342,7 @@ WXDWORD wxNotebook::MSWGetStyle(long style, WXDWORD *exstyle) const
else if ( style & wxNB_LEFT )
tabStyle |= TCS_VERTICAL;
else if ( style & wxNB_RIGHT )
tabStyle |= TCS_VERTICAL | TCS_RIGHT;
tabStyle |= TCS_VERTICAL | TCS_RIGHT;
// ex style
if ( exstyle )
@@ -485,6 +466,29 @@ void wxNotebook::SetImageList(wxImageList* imageList)
// wxNotebook size settings
// ----------------------------------------------------------------------------
wxRect wxNotebook::GetPageSize() const
{
wxRect r;
RECT rc;
::GetClientRect(GetHwnd(), &rc);
// This check is to work around a bug in TabCtrl_AdjustRect which will
// cause a crash on win2k, or on XP with themes disabled, if the
// wxNB_MULTILINE style is used and the rectangle is very small, (such as
// when the notebook is first created.) The value of 20 is just
// arbitrarily chosen, if there is a better way to determine this value
// then please do so. --RD
if ( !HasFlag(wxNB_MULTILINE) || (rc.right > 20 && rc.bottom > 20) )
{
TabCtrl_AdjustRect(m_hwnd, false, &rc);
wxCopyRECTToRect(rc, r);
}
return r;
}
void wxNotebook::SetPageSize(const wxSize& size)
{
// transform the page size into the notebook size
@@ -543,23 +547,10 @@ void wxNotebook::AdjustPageSize(wxNotebookPage *page)
{
wxCHECK_RET( page, _T("NULL page in wxNotebook::AdjustPageSize") );
RECT rc;
rc.left =
rc.top = 0;
// get the page size from the notebook size
GetSize((int *)&rc.right, (int *)&rc.bottom);
// This check is to work around a bug in TabCtrl_AdjustRect which will
// cause a crash on win2k, or on XP with themes disabled, if the
// wxNB_MULTILINE style is used and the rectangle is very small, (such as
// when the notebook is first created.) The value of 20 is just
// arbitrarily chosen, if there is a better way to determine this value
// then please do so. --RD
if (rc.right > 20 && rc.bottom > 20)
const wxRect r = GetPageSize();
if ( !r.IsEmpty() )
{
TabCtrl_AdjustRect(m_hwnd, false, &rc);
page->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
page->SetSize(r);
}
}
@@ -969,35 +960,63 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
#if wxUSE_UXTHEME
bool wxNotebook::DoDrawBackground(WXHDC hDC, wxWindow *child)
{
wxUxThemeHandle theme(child ? child : this, L"TAB");
if ( !theme )
return false;
// get the notebook client rect (we're not interested in drawing tabs
// themselves)
wxRect r = GetPageSize();
if ( r.IsEmpty() )
return false;
RECT rc;
wxCopyRectToRECT(r, rc);
// map rect to the coords of the window we're drawing in
if ( child )
::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2);
// apparently DrawThemeBackground() modifies the rect passed to it and if we
// don't do these adjustments, there are some drawing artifacts which are
// only visible with some non default themes; so modify the rect here using
// the magic numbers below so that it still paints the correct area
rc.left -= 2;
rc.top -= 2;
rc.right += 4;
rc.bottom += 5;
wxUxThemeEngine::Get()->DrawThemeBackground
(
theme,
hDC,
9 /* TABP_PANE */,
0,
&rc,
NULL
);
return true;
}
WXHBRUSH wxNotebook::QueryBgBitmap()
{
RECT rc;
::GetClientRect(GetHwnd(), &rc);
// adjust position
TabCtrl_AdjustRect(GetHwnd(), false, &rc);
wxRect r = GetPageSize();
if ( r.IsEmpty() )
return 0;
WindowHDC hDC(GetHwnd());
MemoryHDC hDCMem(hDC);
CompatibleBitmap hBmp(hDC, rc.right, rc.bottom);
CompatibleBitmap hBmp(hDC, r.x + r.width, r.y + r.height);
SelectInHDC selectBmp(hDCMem, hBmp);
wxUxThemeHandle theme(this, L"TAB");
if ( theme )
{
AdjustRectForThemeBg(rc);
wxUxThemeEngine::Get()->DrawThemeBackground
(
theme,
(WXHDC)hDCMem,
9 /* TABP_PANE */,
0,
&rc,
NULL
);
}
if ( !DoDrawBackground((WXHDC)(HDC)hDCMem) )
return 0;
return (WXHBRUSH)::CreatePatternBrush(hBmp);
}
@@ -1011,7 +1030,7 @@ void wxNotebook::UpdateBgBrush()
{
m_hbrBackground = QueryBgBitmap();
}
else // no themes
else // no themes or we've got user-defined solid colour
{
m_hbrBackground = NULL;
}
@@ -1039,63 +1058,13 @@ WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win)
return wxNotebookBase::MSWGetBgBrushForChild(hDC, win);
}
wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *WXUNUSED(win))
bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child)
{
if ( m_hasBgCol )
return GetBackgroundColour();
// solid background colour overrides themed background drawing
if ( !UseBgCol() && DoDrawBackground(hDC, child) )
return true;
// Experimental: don't do this since we're doing it in wxPanel
#if 0 // defined(__POCKETPC__) || defined(__SMARTPHONE__)
// For some reason, the pages will be grey by default.
// Normally they should be white on these platforms.
// (However the static control backgrounds are painted
// in the correct colour, just not the rest of it.)
// So let's give WinCE a hint.
else if (!win->m_hasBgCol)
return *wxWHITE;
#endif
if ( !wxUxThemeEngine::GetIfActive() )
return wxNullColour;
return GetThemeBackgroundColour();
}
bool
wxNotebook::MSWPrintChild(wxWindow *win,
WXWPARAM wParam,
WXLPARAM WXUNUSED(lParam))
{
// Don't paint the theme for the child if we have a solid background
if ( m_hasBgCol )
return false;
RECT rc;
::GetClientRect(GetHwnd(), &rc);
// adjust position
TabCtrl_AdjustRect(GetHwnd(), false, &rc);
wxUxThemeHandle theme(win, L"TAB");
if ( theme )
{
// map from this client to win client coords
::MapWindowPoints(GetHwnd(), GetHwndOf(win), (POINT *)&rc, 2);
AdjustRectForThemeBg(rc);
wxUxThemeEngine::Get()->DrawThemeBackground
(
theme,
(WXHDC)wParam,
9 /* TABP_PANE */,
0,
&rc,
NULL
);
}
return true;
return wxNotebookBase::MSWPrintChild(hDC, child);
}
#endif // wxUSE_UXTHEME