X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b380533ca291b64cee54c2eb6ab5bf34c177d4a0..722f74cec895bbc284ba7b7a7213ee5cf2a1ab95:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index a07207c10e..5c9cd14cd2 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -36,6 +36,7 @@ #include "wx/sysopt.h" #include "wx/msw/private.h" +#include "wx/msw/dc.h" #include #include "wx/msw/winundef.h" @@ -97,6 +98,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 // ---------------------------------------------------------------------------- @@ -108,7 +123,7 @@ WX_DEFINE_LIST( wxNotebookPageInfoList ) DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) -BEGIN_EVENT_TABLE(wxNotebook, wxControl) +BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase) EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) @@ -161,7 +176,7 @@ wxBEGIN_FLAGS( wxNotebookStyle ) wxEND_FLAGS( wxNotebookStyle ) -IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebook, wxControl,"wx/notebook.h") +IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebook, wxBookCtrlBase,"wx/notebook.h") IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebookPageInfo, wxObject , "wx/notebook.h" ) wxCOLLECTION_TYPE_INFO( wxNotebookPageInfo * , wxNotebookPageInfoList ) ; @@ -198,7 +213,7 @@ wxEND_HANDLERS_TABLE() wxCONSTRUCTOR_4( wxNotebookPageInfo , wxNotebookPage* , Page , wxString , Text , bool , Selected , int , ImageId ) #else -IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxBookCtrlBase) IMPLEMENT_DYNAMIC_CLASS(wxNotebookPageInfo, wxObject ) #endif IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent) @@ -283,11 +298,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 +375,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 @@ -931,9 +946,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 +1146,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 +1170,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) else if ( parent ) { event.SetCurrentFocus(this); - parent->GetEventHandler()->ProcessEvent(event); + parent->HandleWindowEvent(event); } } } @@ -1427,7 +1444,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; }