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. | ||||
|     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);) | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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 ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user