// wxWidgets
#ifndef WX_PRECOMP
#include "wx/string.h"
+ #include "wx/dc.h"
#endif // WX_PRECOMP
#include "wx/log.h"
long style,
const wxString& name)
{
- // Does ComCtl32 support non-top tabs?
- int verComCtl32 = wxApp::GetComCtl32Version();
- if ( verComCtl32 < 470 || verComCtl32 >= 600 )
+ // 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();
+ if ( verComCtl32 == 600 )
{
- if (style & wxNB_BOTTOM)
- style &= ~wxNB_BOTTOM;
-
- if (style & wxNB_LEFT)
- style &= ~wxNB_LEFT;
-
- if (style & wxNB_RIGHT)
- style &= ~wxNB_RIGHT;
+ // check if we use themes at all -- if we don't, we're still ok
+#if wxUSE_UXTHEME
+ if ( wxUxThemeEngine::GetIfActive() )
+#endif
+ {
+ style &= ~(wxNB_BOTTOM | wxNB_LEFT | wxNB_RIGHT);
+ }
}
if ( !CreateControl(parent, id, pos, size, style | wxTAB_TRAVERSAL,
#if wxUSE_UXTHEME
-void wxNotebook::UpdateBgBrush()
+WXHANDLE wxNotebook::QueryBgBitmap(wxWindow *win)
{
- if ( m_hbrBackground )
- ::DeleteObject((HBRUSH)m_hbrBackground);
+ RECT rc;
+ GetWindowRect(GetHwnd(), &rc);
+
+ WindowHDC hDC(GetHwnd());
+ MemoryHDC hDCMem(hDC);
+ CompatibleBitmap hBmp(hDC, rc.right - rc.left, rc.bottom - rc.top);
+
+ SelectInHDC selectBmp(hDCMem, hBmp);
- if ( wxUxThemeEngine::GetIfActive() )
+ ::SendMessage(GetHwnd(), WM_PRINTCLIENT,
+ (WPARAM)(HDC)hDCMem,
+ PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT);
+
+ if ( win )
{
- RECT rc;
- GetWindowRect(GetHwnd(), &rc);
+ RECT rc2;
+ ::GetWindowRect(GetHwndOf(win), &rc2);
- WindowHDC hDC(GetHwnd());
- MemoryHDC hDCMem(hDC);
- CompatibleBitmap hBmp(hDC, rc.right - rc.left, rc.bottom - rc.top);
+ COLORREF c = ::GetPixel(hDCMem, rc2.left - rc.left, rc2.top - rc.top);
- SelectInHDC selectBmp(hDCMem, hBmp);
+ return (WXHANDLE)c;
+ }
+ else // we are asked to create the brush
+ {
+ return (WXHANDLE)::CreatePatternBrush(hBmp);
+ }
+}
- SendMessage(GetHwnd(), WM_PRINTCLIENT, (WPARAM)(HDC)hDCMem,
- PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT);
+void wxNotebook::UpdateBgBrush()
+{
+ if ( m_hbrBackground )
+ ::DeleteObject((HBRUSH)m_hbrBackground);
- m_hbrBackground = (WXHBRUSH)::CreatePatternBrush(hBmp);
+ if ( !m_hasBgCol && wxUxThemeEngine::GetIfActive() )
+ {
+ m_hbrBackground = (WXHBRUSH)QueryBgBitmap();
}
else // no themes
{
}
}
-WXHBRUSH wxNotebook::GetThemeBackgroundBrush(WXHDC hDC, wxWindow *win) const
+WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win)
{
if ( m_hbrBackground )
{
{
wxLogLastError(_T("SetBrushOrgEx(notebook bg brush)"));
}
+
+ return m_hbrBackground;
}
- return m_hbrBackground;
+ return wxNotebookBase::MSWGetBgBrushForChild(hDC, win);
}
-void wxNotebook::DoEraseBackground(wxEraseEvent& event)
+wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *win)
{
- // we can either draw the background ourselves or let DrawThemeBackground()
- // do it, but as we already have the correct brush, let's do it ourselves
- // (note that we use the same code in wxControl::MSWControlColor(), so if
- // it breaks, it should at least break in consistent way)
- wxWindow *win = (wxWindow *)event.GetEventObject();
- HDC hdc = GetHdcOf(*event.GetDC());
- WXHBRUSH hbr = GetThemeBackgroundBrush((WXHDC)hdc, win);
- if ( hbr )
- {
- RECT rectClient;
- ::GetClientRect(GetHwndOf(win), &rectClient);
- ::FillRect(hdc, &rectClient, (HBRUSH)hbr);
- }
+ if ( m_hasBgCol )
+ return GetBackgroundColour();
+
+ if ( !wxUxThemeEngine::GetIfActive() )
+ return wxNullColour;
+
+ COLORREF c = (COLORREF)QueryBgBitmap(win);
+
+ return c == CLR_INVALID ? wxNullColour : wxRGBToColour(c);
}
#endif // wxUSE_UXTHEME