Adjust the font size when DPI of window changes
This commit is contained in:
		
				
					committed by
					
						 Maarten Bent
						Maarten Bent
					
				
			
			
				
	
			
			
			
						parent
						
							e3d3a0b7e8
						
					
				
				
					commit
					e563d4858a
				
			| @@ -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);) | ||||||
|   | |||||||
| @@ -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, | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
| @@ -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(); | ||||||
|   | |||||||
| @@ -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 ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user