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. // account as well.
static int GetNumericWeightOf(wxFontWeight weight); 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 // this doesn't do anything and is kept for compatibility only
#if WXWIN_COMPATIBILITY_2_8 #if WXWIN_COMPATIBILITY_2_8
wxDEPRECATED_INLINE(void SetNoAntiAliasing(bool no = true), wxUnusedVar(no);) wxDEPRECATED_INLINE(void SetNoAntiAliasing(bool no = true), wxUnusedVar(no);)

View File

@@ -120,6 +120,8 @@ public:
virtual bool IsFixedWidth() const wxOVERRIDE; 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") wxDEPRECATED_MSG("use wxFONT{FAMILY,STYLE,WEIGHT}_XXX constants ie: wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD")
wxFont(int size, wxFont(int size,
int family, int family,

View File

@@ -592,6 +592,11 @@ public:
void MSWUpdateOnDPIChange(const wxSize& oldDPI, const wxSize& newDPI); void MSWUpdateOnDPIChange(const wxSize& oldDPI, const wxSize& newDPI);
protected: 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 // this allows you to implement standard control borders without
// repeating the code in different classes that are not derived from // repeating the code in different classes that are not derived from
// wxControl // wxControl

View File

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

View File

@@ -512,7 +512,8 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew) void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew)
{ {
// We don't have the correct DPI to use here, so use that of the // 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); const int ppi = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
lf.lfHeight = GetLogFontHeightAtPPI(pointSizeNew, ppi); lf.lfHeight = GetLogFontHeightAtPPI(pointSizeNew, ppi);
@@ -899,6 +900,19 @@ void wxFont::SetPixelSize(const wxSize& pixelSize)
M_FONTDATA->SetPixelSize(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) void wxFont::SetFamily(wxFontFamily family)
{ {
AllocExclusive(); AllocExclusive();

View File

@@ -4837,6 +4837,17 @@ wxSize wxWindowMSW::GetDPI() const
return dpi; 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 // Helper function to update the given coordinate by the scaling factor if it
// is set, i.e. different from wxDefaultCoord. // is set, i.e. different from wxDefaultCoord.
static void ScaleCoordIfSet(int& coord, float scaleFactor) static void ScaleCoordIfSet(int& coord, float scaleFactor)
@@ -4861,6 +4872,9 @@ wxWindowMSW::MSWUpdateOnDPIChange(const wxSize& oldDPI, const wxSize& newDPI)
InvalidateBestSize(); InvalidateBestSize();
// update font if necessary
MSWUpdateFontOnDPIChange(newDPI);
// update children // update children
wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); wxWindowList::compatibility_iterator current = GetChildren().GetFirst();
while ( current ) while ( current )