Adjust the font size when DPI of window changes

This commit is contained in:
Vadim Zeitlin 2018-12-30 01:06:19 +01:00 committed by Maarten Bent
parent e3d3a0b7e8
commit e563d4858a
6 changed files with 48 additions and 1 deletions

View File

@ -501,6 +501,13 @@ public:
// account as well.
static int GetNumericWeightOf(wxFontWeight weight);
// Some ports need to modify the font object when the DPI of the window it
// is used with changes, this function can be used to do it.
//
// Currently it is only used in wxMSW and is not considered to be part of
// wxWidgets public API.
virtual void WXAdjustToPPI(const wxSize& WXUNUSED(ppi)) { }
// this doesn't do anything and is kept for compatibility only
#if WXWIN_COMPATIBILITY_2_8
wxDEPRECATED_INLINE(void SetNoAntiAliasing(bool no = true), wxUnusedVar(no);)

View File

@ -120,6 +120,8 @@ public:
virtual bool IsFixedWidth() const wxOVERRIDE;
virtual void WXAdjustToPPI(const wxSize& ppi) wxOVERRIDE;
wxDEPRECATED_MSG("use wxFONT{FAMILY,STYLE,WEIGHT}_XXX constants ie: wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD")
wxFont(int size,
int family,

View File

@ -592,6 +592,11 @@ public:
void MSWUpdateOnDPIChange(const wxSize& oldDPI, const wxSize& newDPI);
protected:
// Called from MSWUpdateOnDPIChange() specifically to update the control
// font, as this may need to be done differently for some specific native
// controls. The default version updates m_font of this window.
virtual void MSWUpdateFontOnDPIChange(const wxSize& newDPI);
// this allows you to implement standard control borders without
// repeating the code in different classes that are not derived from
// wxControl

View File

@ -1726,6 +1726,8 @@ wxFont wxWindowBase::GetFont() const
if ( !font.IsOk() )
font = GetClassDefaultAttributes().font;
font.WXAdjustToPPI(GetDPI());
return font;
}
else
@ -1744,6 +1746,9 @@ bool wxWindowBase::SetFont(const wxFont& font)
m_hasFont = font.IsOk();
m_inheritFont = m_hasFont;
if ( m_hasFont )
m_font.WXAdjustToPPI(GetDPI());
InvalidateBestSize();
return true;

View File

@ -512,7 +512,8 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew)
{
// We don't have the correct DPI to use here, so use that of the
// primary screen.
// primary screen and rely on WXAdjustToPPI() changing it later if
// necessary.
const int ppi = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
lf.lfHeight = GetLogFontHeightAtPPI(pointSizeNew, ppi);
@ -899,6 +900,19 @@ void wxFont::SetPixelSize(const wxSize& pixelSize)
M_FONTDATA->SetPixelSize(pixelSize);
}
void wxFont::WXAdjustToPPI(const wxSize& ppi)
{
// We only use vertical component here as we only adjust LOGFONT::lfHeight.
const int heightNew = M_FONTDATA->GetLogFontHeightAtPPI(ppi.y);
if ( heightNew != M_FONTDATA->GetLogFontHeight() )
{
AllocExclusive();
M_FONTDATA->SetLogFontHeight(heightNew);
}
}
void wxFont::SetFamily(wxFontFamily family)
{
AllocExclusive();

View File

@ -4837,6 +4837,17 @@ wxSize wxWindowMSW::GetDPI() const
return dpi;
}
void wxWindowMSW::MSWUpdateFontOnDPIChange(const wxSize& newDPI)
{
if ( m_font.IsOk() )
{
m_font.WXAdjustToPPI(newDPI);
// WXAdjustToPPI() changes the HFONT, so reassociate it with the window.
wxSetWindowFont(GetHwnd(), m_font);
}
}
// Helper function to update the given coordinate by the scaling factor if it
// is set, i.e. different from wxDefaultCoord.
static void ScaleCoordIfSet(int& coord, float scaleFactor)
@ -4861,6 +4872,9 @@ wxWindowMSW::MSWUpdateOnDPIChange(const wxSize& oldDPI, const wxSize& newDPI)
InvalidateBestSize();
// update font if necessary
MSWUpdateFontOnDPIChange(newDPI);
// update children
wxWindowList::compatibility_iterator current = GetChildren().GetFirst();
while ( current )