From abb20c414d2da84355fe9e637ddbe23f2f6a4682 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 13 Jan 2019 15:53:59 +0100 Subject: [PATCH] Fix font size of wxMenuItem with custom font on DPI change Recalculate MenuDrawData sizes after the DPI changes, and reset the maximum accelerator width. --- src/msw/menuitem.cpp | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/msw/menuitem.cpp b/src/msw/menuitem.cpp index 3163cd5575..e18f457317 100644 --- a/src/msw/menuitem.cpp +++ b/src/msw/menuitem.cpp @@ -29,7 +29,6 @@ #include "wx/stockitem.h" #ifndef WX_PRECOMP - #include "wx/app.h" #include "wx/dcmemory.h" #include "wx/font.h" #include "wx/bitmap.h" @@ -235,28 +234,41 @@ public: bool Theme; // is data initialized for FullTheme? - static const MenuDrawData* Get() + int dpi; // DPI used for calculating sizes + + static const MenuDrawData* Get(wxMenu* menu) { + const wxWindow* window = menu->GetWindow(); // notice that s_menuData can't be created as a global variable because // it needs a window to initialize and no windows exist at the time of // globals initialization yet if ( !ms_instance ) { - static MenuDrawData s_menuData; + static MenuDrawData s_menuData(window); ms_instance = &s_menuData; } #if wxUSE_UXTHEME bool theme = MenuLayout() == FullTheme; if ( ms_instance->Theme != theme ) - ms_instance->Init(); + { + ms_instance->Init(window); + } + else #endif // wxUSE_UXTHEME + { + if ( ms_instance->dpi != window->GetDPI().y ) + { + ms_instance->Init(window); + menu->ResetMaxAccelWidth(); + } + } return ms_instance; } - MenuDrawData() + MenuDrawData(const wxWindow* window) { - Init(); + Init(window); } @@ -296,17 +308,16 @@ public: } private: - void Init(); + void Init(wxWindow const* window); static MenuDrawData* ms_instance; }; MenuDrawData* MenuDrawData::ms_instance = NULL; -void MenuDrawData::Init() +void MenuDrawData::Init(wxWindow const* window) { #if wxUSE_UXTHEME - const wxWindow* window = wxTheApp ? wxTheApp->GetTopWindow() : NULL; if ( IsUxThemeActive() ) { wxUxThemeHandle hTheme(window, L"MENU"); @@ -348,7 +359,8 @@ void MenuDrawData::Init() wxUxThemeFont themeFont; ::GetThemeSysFont(hTheme, TMT_MENUFONT, themeFont.GetPtr()); - Font = wxFont(wxNativeFontInfo(themeFont.GetLOGFONT(), window)); + // Use NULL window for wxNativeFontInfo, height it is already at the correct ppi + Font = wxFont(wxNativeFontInfo(themeFont.GetLOGFONT(), NULL)); Theme = true; @@ -407,6 +419,7 @@ void MenuDrawData::Init() AlwaysShowCues = value == 1; + dpi = window->GetDPI().y; } } // anonymous namespace @@ -783,7 +796,7 @@ wxString wxMenuItem::GetName() const bool wxMenuItem::OnMeasureItem(size_t *width, size_t *height) { - const MenuDrawData* data = MenuDrawData::Get(); + const MenuDrawData* data = MenuDrawData::Get(GetMenu()); if ( IsOwnerDrawn() ) { @@ -875,7 +888,7 @@ bool wxMenuItem::OnMeasureItem(size_t *width, size_t *height) bool wxMenuItem::OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction WXUNUSED(act), wxODStatus stat) { - const MenuDrawData* data = MenuDrawData::Get(); + const MenuDrawData* data = MenuDrawData::Get(GetMenu()); wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); HDC hdc = GetHdcOf(*impl); @@ -1167,7 +1180,7 @@ void wxMenuItem::DrawStdCheckMark(WXHDC hdc_, const RECT* rc, wxODStatus stat) { wxUxThemeHandle hTheme(GetMenu()->GetWindow(), L"MENU"); - const MenuDrawData* data = MenuDrawData::Get(); + const MenuDrawData* data = MenuDrawData::Get(GetMenu()); // rect for background must be without check margins RECT rcBg = *rc; @@ -1234,7 +1247,8 @@ void wxMenuItem::GetFontToUse(wxFont& font) const { font = GetFont(); if ( !font.IsOk() ) - font = MenuDrawData::Get()->Font; + font = MenuDrawData::Get(GetMenu())->Font; + font.WXAdjustToPPI(GetMenu()->GetWindow()->GetDPI()); } void wxMenuItem::GetColourToUse(wxODStatus stat, wxColour& colText, wxColour& colBack) const