Fix font size of wxMenuItem with custom font on DPI change

Recalculate MenuDrawData sizes after the DPI changes, and reset the maximum
accelerator width.
This commit is contained in:
Maarten Bent
2019-01-13 15:53:59 +01:00
parent 87a97054f2
commit abb20c414d

View File

@@ -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