<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="RSS_xslt_style.asp" version="1.0" ?>
<rss version="2.0" xmlns:WebWizForums="https://syndication.webwiz.net/rss_namespace/">
 <channel>
  <title>Codejock Developer Community : Problems with HighDPI in v17.0.0</title>
  <link>http://forum.codejock.com/</link>
  <description><![CDATA[This is an XML content feed of; Codejock Developer Community : Toolkit Pro : Problems with HighDPI in v17.0.0]]></description>
  <copyright>Copyright (c) 2006-2013 Web Wiz Forums - All Rights Reserved.</copyright>
  <pubDate>Sun, 19 Apr 2026 21:48:13 +0000</pubDate>
  <lastBuildDate>Tue, 02 Feb 2016 11:59:13 +0000</lastBuildDate>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Web Wiz Forums 12.04</generator>
  <ttl>360</ttl>
  <WebWizForums:feedURL>forum.codejock.com/RSS_post_feed.asp?TID=22876</WebWizForums:feedURL>
  <image>
   <title><![CDATA[Codejock Developer Community]]></title>
   <url>http://forum.codejock.com/forum_images/codejock-logo.gif</url>
   <link>http://forum.codejock.com/</link>
  </image>
  <item>
   <title><![CDATA[Problems with HighDPI in v17.0.0 : Hello,First I would like to thank...]]></title>
   <link>http://forum.codejock.com/forum_posts.asp?TID=22876&amp;PID=74396&amp;title=problems-with-highdpi-in-v17-0-0#74396</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://forum.codejock.com/member_profile.asp?PF=903">Alex G.</a><br /><strong>Subject:</strong> 22876<br /><strong>Posted:</strong> 02 February 2016 at 11:59am<br /><br />Hello,<br /><br />First I would like to thank you for the (almost) complete support of HighDPI environments.<br /><br />I found some problems, which should be addressed in the upcoming release.<br /><br />Problem: <br /><br />Two monitors, one 4K 40" is running native 3840x2160, no text resizing, everything is at 100%.<br />This is the MAIN desktop ( important ).<br /><br />The other monitor is a 24" at 1920x1080, but this one was set to text scaling of 125%. So the DPI factor here is 1.25<br /><br />When I move the app window from the MAIN monitor to the other one, the internal scaling factor of XtremeToolkit still reports 1.00, which is not correct. Digging into the code, it's clear why, you guys get the DPI factor from the main desktop monitor.<br /><br />void CXTPDpi::Init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!m_bInitialized)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDC hdc = ::GetDC(NULL);<br /><br />That's a problem, you should always use the app windows monitor as the source!<br /><br />Another problem is the font height calculation in the CXTPPaintManager.<br /><br />The Statusbar doesn't change the font too, so the Coders should check the code there also. <br /><br />Because we use quite a few custom made controls in our app, we have already the infrastructure to detect DPI changes. Here are some parts of the code we're using. It's stripped down a bit, it should be easy to reuse.<br /><br />We modified /extended the Toolkit's code in: <br /><br />  void CXTPPaintManager::UpdateFonts()<br />  void CXTPDpi::Init(int dpi)<br /><br />Modified code is tagged with ANKHOR<br /><br /><br />Here's the source:<br /><br />double AnkhorGetDPI(CWnd * cwnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factor;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC = cwnd-&gt;GetDC();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factor = ::GetDeviceCaps(pDC-&gt;m_hDC, LOGPIXELSY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cwnd-&gt;ReleaseDC(pDC);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (cwnd-&gt;GetParent() != NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cwnd = cwnd-&gt;GetParent();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FuncGetDpiForMonitor pGetDpiForMonitor = (FuncGetDpiForMonitor)GetProcAddress(GetModuleHandle(_T("Shcore.dll")), "GetDpiForMonitor");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pGetDpiForMonitor != NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT dpiX, dpiY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pGetDpiForMonitor(MonitorFromWindow(cwnd-&gt;GetSafeHwnd(), MONITOR_DEFAULTTONEAREST), 0, &dpiX, &dpiY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factor = dpiY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return factor;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />LRESULT CMainFrame::OnDPIChanged(WPARAM wParam, LPARAM lParam)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idpi = AnkhorGetDPI(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dpi = idpi / 96.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( mMan-&gt;GetDisplayDPIFactor() != dpi )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcNewScale(*(LPRECT)lParam);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRC( L"DPI: %f\n", dpi );<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LockWindowUpdate();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// No DPI Position change, when not yet opened<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IsWindowVisible())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowPos(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&wndTop,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcNewScale.left,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcNewScale.top,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcNewScale.Width(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcNewScale.Height(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XTPDpiHelper()-&gt;Init(idpi);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ANKHOR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCommandBars()-&gt;GetPaintManager()-&gt;RefreshMetrics();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawAll();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnlockWindowUpdate();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void CXTPPaintManager::UpdateFonts()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CNonClientMetrics ncm;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE lfCharSet = XTPResourceManager()-&gt;GetFontCharset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL bUseClearType = m_bClearTypeTextQuality && XTPSystemVersion()-&gt;IsClearTypeTextQualitySupported();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (m_bUseStandardFont)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CWindowDC dc(NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLogFont lf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfHeight = ncm.lfMenuFont.lfHeight &lt; 0 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;? min(-XTP_COMMANDBAR_MIN_FONT_HEIGHT, ncm.lfMenuFont.lfHeight) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: ncm.lfMenuFont.lfHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfWeight = ncm.lfMenuFont.lfWeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfItalic = ncm.lfMenuFont.lfItalic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfCharSet = lfCharSet;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfQuality = ncm.lfMenuFont.lfQuality;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRCPY_S(lf.lfFaceName, LF_FACESIZE, ncm.lfMenuFont.lfFaceName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bUseClearType)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfQuality = CLEARTYPE_QUALITY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (0 &lt; m_nFontHeight)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfHeight = -m_nFontHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfHeight = lf.lfHeight* XTPDpiHelper()-&gt;GetDPIY() / dc.GetDeviceCaps(LOGPIXELSY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ANKHOR<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nTextHeight = CalcTextHeight(lf.lfHeight, XTP_COMMANDBAR_TEXT_HEIGHT_FACTOR, XTP_DEFAULT_DISPLAY_DPI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nEditHeight = CalcCtrlHeight(lf.lfHeight, XTP_COMMANDBAR_CONTROL_HEIGHT_FACTOR, XTP_DEFAULT_DISPLAY_DPI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nSplitButtonDropDownWidth = CalcSplitButtonDropDownWidth(m_nTextHeight);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nSplitButtonDropDownHeight = CalcSplitButtonDropDownHeight(lf.lfHeight);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCommandBarsFontIndirect(&lf, TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGFONT lfIcon;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(CXTPDrawHelpers::GetIconLogFont(&lfIcon));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bUseClearType)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lfIcon.lfQuality = CLEARTYPE_QUALITY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncm.lfSmCaptionFont.lfQuality = CLEARTYPE_QUALITY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncm.lfStatusFont.lfQuality = CLEARTYPE_QUALITY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lfIcon.lfCharSet = lfCharSet;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(m_fontIcon.SetStandardFont(&lfIcon));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lfIcon.lfWeight = FW_BOLD;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(m_fontIconBold.SetStandardFont(&lfIcon));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncm.lfSmCaptionFont.lfCharSet = lfCharSet;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_fontSmCaption.SetStandardFont(&ncm.lfSmCaptionFont);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncm.lfStatusFont.lfCharSet = lfCharSet;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_fontToolTip.SetStandardFont(&ncm.lfStatusFont);<br />}<br /><br />// ANKHOR<br />void CXTPDpi::Init(int dpi)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_idpiX = dpi;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_idpiY = dpi;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt;= DpiValueCount; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nPositiveDpiValues<em>.x = ScaleXInternal(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nPositiveDpiValues<em>.y = ScaleYInternal(i);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nNegativeDpiValues<em>.x = ScaleXInternal(-i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nNegativeDpiValues<em>.y = ScaleYInternal(-i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />]]>
   </description>
   <pubDate>Tue, 02 Feb 2016 11:59:13 +0000</pubDate>
   <guid isPermaLink="true">http://forum.codejock.com/forum_posts.asp?TID=22876&amp;PID=74396&amp;title=problems-with-highdpi-in-v17-0-0#74396</guid>
  </item> 
 </channel>
</rss>