From 4a3098aebb6db356404cf098bcb280a4b499a0e1 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 17 Apr 2022 00:42:27 +0200 Subject: [PATCH] Optimize MSW wxNotebook background painting MSWDefWindowProc(WM_PAINT, ...) in OnPaint causes performance issues on large screens so only use it when an actual custom background colour is set. Closes #22308. Closes #22320. --- include/wx/msw/notebook.h | 12 ++---------- src/msw/notebook.cpp | 27 ++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index e2c2d31915..12bf1ac87a 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -122,17 +122,9 @@ public: // implementation only // ------------------- + virtual bool SetBackgroundColour(const wxColour& colour) wxOVERRIDE; + #if wxUSE_UXTHEME - virtual bool SetBackgroundColour(const wxColour& colour) wxOVERRIDE - { - if ( !wxNotebookBase::SetBackgroundColour(colour) ) - return false; - - UpdateBgBrush(); - - return true; - } - // draw child background virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win) wxOVERRIDE; diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 18308bc6aa..f91161c93e 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -109,11 +109,6 @@ static bool HasTroubleWithNonTopTabs() wxBEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase) EVT_SIZE(wxNotebook::OnSize) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) - -#if USE_NOTEBOOK_ANTIFLICKER - EVT_ERASE_BACKGROUND(wxNotebook::OnEraseBackground) - EVT_PAINT(wxNotebook::OnPaint) -#endif // USE_NOTEBOOK_ANTIFLICKER wxEND_EVENT_TABLE() // ============================================================================ @@ -1081,6 +1076,28 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) } } +bool wxNotebook::SetBackgroundColour(const wxColour& colour) +{ + if ( !wxNotebookBase::SetBackgroundColour(colour) ) + return false; + +#if wxUSE_UXTHEME + UpdateBgBrush(); +#endif // wxUSE_UXTHEME + +#if USE_NOTEBOOK_ANTIFLICKER + Unbind(wxEVT_ERASE_BACKGROUND, &wxNotebook::OnEraseBackground, this); + Unbind(wxEVT_PAINT, &wxNotebook::OnPaint, this); + if ( m_hasBgCol || !wxUxThemeIsActive() ) + { + Bind(wxEVT_ERASE_BACKGROUND, &wxNotebook::OnEraseBackground, this); + Bind(wxEVT_PAINT, &wxNotebook::OnPaint, this); + } +#endif // USE_NOTEBOOK_ANTIFLICKER + + return true; +} + #if wxUSE_UXTHEME WXHBRUSH wxNotebook::QueryBgBitmap()