X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4322df68b099e5e983acc0a3dad4ad5841b57b5..18591d70d9f37ca7af5208c68d4647192b07740d:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 5b5fa833fb..93b01f37f6 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -97,6 +97,20 @@ LRESULT APIENTRY _EXPORT wxNotebookWndProc(HWND hwnd, #endif // USE_NOTEBOOK_ANTIFLICKER +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +static bool HasTroubleWithNonTopTabs() +{ + const int verComCtl32 = wxApp::GetComCtl32Version(); + + // 600 is XP, 616 is Vista -- and both have a problem with tabs not on top + // (but don't just test for >= 600 as Microsoft might decide to fix it in + // later versions, who knows...) + return verComCtl32 >= 600 && verComCtl32 <= 616; +} + // ---------------------------------------------------------------------------- // event table // ---------------------------------------------------------------------------- @@ -283,11 +297,11 @@ bool wxNotebook::Create(wxWindow *parent, #endif #if !wxUSE_UXTHEME - // ComCtl32 notebook tabs simply don't work unless they're on top if we have uxtheme, we can - // work around it later (after control creation), but if we don't have uxtheme, we have to clear - // those styles - const int verComCtl32 = wxApp::GetComCtl32Version(); - if ( verComCtl32 == 600 ) + // ComCtl32 notebook tabs simply don't work unless they're on top if we + // have uxtheme, we can work around it later (after control creation), but + // if we have been compiled without uxtheme support, we have to clear those + // styles + if ( HasTroubleWithNonTopTabs() ) { style &= ~(wxBK_BOTTOM | wxBK_LEFT | wxBK_RIGHT); } @@ -360,16 +374,16 @@ bool wxNotebook::Create(wxWindow *parent, // comctl32.dll 6.0 doesn't support non-top tabs with visual styles (the // control is simply not rendered correctly), so we disable themes // if possible, otherwise we simply clear the styles. - // It's probably not possible to have UXTHEME without ComCtl32 6 or better, but lets - // check it anyway. - const int verComCtl32 = wxApp::GetComCtl32Version(); - if ( verComCtl32 == 600 ) + if ( HasTroubleWithNonTopTabs() && + (style & (wxBK_BOTTOM | wxBK_LEFT | wxBK_RIGHT)) ) { // check if we use themes at all -- if we don't, we're still okay - if ( wxUxThemeEngine::GetIfActive() && (style & (wxBK_BOTTOM|wxBK_LEFT|wxBK_RIGHT))) + if ( wxUxThemeEngine::GetIfActive() ) { - wxUxThemeEngine::GetIfActive()->SetWindowTheme((HWND)this->GetHandle(), L"", L""); - SetBackgroundColour(GetThemeBackgroundColour()); //correct the background color for the new non-themed control + wxUxThemeEngine::GetIfActive()->SetWindowTheme(GetHwnd(), L"", L""); + + // correct the background color for the new non-themed control + SetBackgroundColour(GetThemeBackgroundColour()); } } #endif // wxUSE_UXTHEME @@ -505,7 +519,7 @@ bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) TC_ITEM tcItem; tcItem.mask = TCIF_TEXT; - tcItem.pszText = (wxChar *)strText.c_str(); + tcItem.pszText = (wxChar *)strText.wx_str(); if ( !HasFlag(wxNB_MULTILINE) ) return TabCtrl_SetItem(GetHwnd(), nPage, &tcItem) != 0; @@ -773,7 +787,7 @@ bool wxNotebook::InsertPage(size_t nPage, if ( !strText.empty() ) { tcItem.mask |= TCIF_TEXT; - tcItem.pszText = (wxChar *)strText.c_str(); // const_cast + tcItem.pszText = (wxChar *)strText.wx_str(); // const_cast } // hide the page: unless it is selected, it shouldn't be shown (and if it @@ -931,9 +945,11 @@ void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event)) hbr = GetHbrushOf(brush); } - ::FillRect(GetHdcOf(memdc), &rc, hbr); + wxMSWDCImpl *impl = (wxMSWDCImpl*) memdc.GetImpl(); + + ::FillRect(GetHdcOf(*impl), &rc, hbr); - MSWDefWindowProc(WM_PAINT, (WPARAM)memdc.GetHDC(), 0); + MSWDefWindowProc(WM_PAINT, (WPARAM)(impl->GetHDC()), 0); // For some reason in RTL mode, source offset has to be -1, otherwise the // right border (physical) remains unpainted. @@ -1129,7 +1145,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) event.SetEventObject(this); wxWindow *page = m_pages[m_nSelection]; - if ( !page->GetEventHandler()->ProcessEvent(event) ) + if ( !page->HandleWindowEvent(event) ) { page->SetFocus(); } @@ -1153,7 +1169,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) else if ( parent ) { event.SetCurrentFocus(this); - parent->GetEventHandler()->ProcessEvent(event); + parent->HandleWindowEvent(event); } } } @@ -1303,14 +1319,17 @@ wxColour wxNotebook::GetThemeBackgroundColour() const if (hTheme) { // This is total guesswork. - // See PlatformSDK\Include\Tmschema.h for values + // See PlatformSDK\Include\Tmschema.h for values. + // JACS: can also use 9 (TABP_PANE) COLORREF themeColor; - wxUxThemeEngine::Get()->GetThemeColor( + bool success = (S_OK == wxUxThemeEngine::Get()->GetThemeColor( hTheme, 10 /* TABP_BODY */, 1 /* NORMAL */, 3821 /* FILLCOLORHINT */, - &themeColor); + &themeColor)); + if (!success) + return GetBackgroundColour(); /* [DS] Workaround for WindowBlinds: @@ -1331,7 +1350,33 @@ wxColour wxNotebook::GetThemeBackgroundColour() const &themeColor); } - return wxRGBToColour(themeColor); + wxColour colour = wxRGBToColour(themeColor); + + // Under Vista, the tab background colour is reported incorrectly. + // So for the default theme at least, hard-code the colour to something + // that will blend in. + + static int s_AeroStatus = -1; + if (s_AeroStatus == -1) + { + WCHAR szwThemeFile[1024]; + WCHAR szwThemeColor[256]; + if (S_OK == wxUxThemeEngine::Get()->GetCurrentThemeName(szwThemeFile, 1024, szwThemeColor, 256, NULL, 0)) + { + wxString themeFile(szwThemeFile), themeColor(szwThemeColor); + if (themeFile.Find(wxT("Aero")) != -1 && themeColor == wxT("NormalColor")) + s_AeroStatus = 1; + else + s_AeroStatus = 0; + } + else + s_AeroStatus = 0; + } + + if (s_AeroStatus == 1) + colour = wxColour(255, 255, 255); + + return colour; } } #endif // wxUSE_UXTHEME @@ -1398,7 +1443,7 @@ bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) event.SetEventObject(this); event.SetInt(idCtrl); - bool processed = GetEventHandler()->ProcessEvent(event); + bool processed = HandleWindowEvent(event); *result = !event.IsAllowed(); return processed; }