﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>学习日记 &#187; DPI</title>
	<atom:link href="https://www.softwareace.cn/?feed=rss2&#038;tag=dpi" rel="self" type="application/rss+xml" />
	<link>https://www.softwareace.cn</link>
	<description>时刻想着为自己的产品多做一些对他好的事情</description>
	<lastBuildDate>Fri, 20 Mar 2026 06:58:28 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Coding for High-DPI Displays in Windows</title>
		<link>https://www.softwareace.cn/?p=1179</link>
		<comments>https://www.softwareace.cn/?p=1179#comments</comments>
		<pubDate>Tue, 03 Feb 2015 14:43:27 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[win32]]></category>
		<category><![CDATA[DPI]]></category>

		<guid isPermaLink="false">http://www.softwareace.cn/?p=1179</guid>
		<description><![CDATA[Deliver crisp text and images on all Windows monitors,  [&#8230;]]]></description>
				<content:encoded><![CDATA[<div id="article-header" style="color: #000000;"><span class="story-teaser" style="font-weight: bold;">Deliver crisp text and images on all Windows monitors, regardless of settings.</span></div>
<div class="story" style="color: #000000;">
<article>In <a style="color: #003bb0;" href="http://www.drdobbs.com/windows/programming-for-high-res-displays-in-win/240168626">the first article in this two-part series</a> on coding for high-DPI displays on the Windows desktop, I explained high-DPI configurations in Windows 8.1 and their effect on the three different kinds of applications: DPI-unaware, system-DPI aware, and per-monitor DPI aware. In this article, I provide a complete example of a system DPI-aware Win32 application and then I&#8217;ll convert it to a per-monitor DPI-aware application that always provides crisp text and images to Windows 8.1 users.</p>
<p>&nbsp;</p>
<h3>Checking the DPI Awareness of Each Process</h3>
<p>The latest versions of <a style="color: #003bb0;" href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx">Process Explorer</a> allow you to easily check the DPI awareness of each process. The default view doesn&#8217;t include the DPI Awareness column. You just need to right-click on the column headers, select Select Columns…, check the DPI Awareness checkbox, and click OK. This way, Process Explorer will add the DPI Awareness column and will display the following three possible values for each running process:</p>
<ul>
<li>Unaware</li>
<li>System Aware</li>
<li>Per-Monitor Aware</li>
</ul>
<p>I&#8217;ll use Process Explorer to make sure that the changes in the DPI Awareness configuration for each new build are reflected in the process.</p>
<p>&nbsp;</p>
<h3>Creating a System DPI Aware Win32 Application in Visual Studio 2013</h3>
<p>You can use the following two mechanisms to set the DPI-awareness level for a process:</p>
<ul>
<li>Declaratively: Specify the desired level of awareness in the <code>dpiAware</code> entry of the application manifest. This way, DWM sets the specified DPI awareness level when the user launches the application. Visual Studio 2013 enables you to set the DPI-awareness level without having to edit the manifest tool.</li>
<li>Procedurally: Call the <code>SetProcessDpiAwareness</code> function with the appropriate value from the<code>PROCESS_DPI_AWARENESS</code> enumeration. The function must be called before any Win32 API call that makes DWM begin virtualization.</li>
</ul>
<p>It is a good practice to use the application manifest instead of calling the <code>SetProcessDpiAwareness</code>function. However, there are specific cases in which you might find it more convenient to make the API call. For the system DPI-aware sample application, I use the recommended process for declaring the DPI awareness level of a sample application and I take advantage of the features included in Visual Studio 2013 to do so. However, it will be necessary to merge a manifest file for compatibility reasons when converting the application to per-monitor DPI aware.</p>
<p>&nbsp;</p>
<p>Create a Visual C++ Win32 Project in Visual Studio 2013. I&#8217;ll use <code>DPIAware</code> for the solution name. Make sure &#8220;Windows application&#8221; is selected in Application type in the Win32 Application Wizard. This way, you will have the basic structure for a C++ Win32 Windows application, and I can focus on the necessary changes in the code for the example. By default, Visual Studio 2013 creates a simple Win32 application with some menu items and an About dialog box. These elements are going to be useful to test how the app works with different DPI aware settings, even before I make any changes to the code.</p>
<p>&nbsp;</p>
<p>To follow along, make sure your display settings in the Display Control Panel item use a scaling level higher than 100% (96 DPI) —you need at least 125% (120 DPI). If your settings specify a scaling level equal to 100% (96 DPI), you won&#8217;t notice the changes I&#8217;ll describe later. However, don&#8217;t forget that any changes in the scaling level configuration will have an impact on all your applications.</p>
<p>By default, the generated Win32 application is DPI-unaware. Execute the application and you will notice the text in the menu bar is blurry because the DWM has virtualized the application window and is scaling it. Select Help | About… and you will also notice the text displayed within the About dialog box and the text for the OK button is blurry. If you use Process Explorer to check the DPI Awareness value for the generated executable (DPIAware.exe), you will see the <code>Unaware</code> value.</p>
<p>Now, stop the execution and right-click on the project name (DPIAware) within Solution Explorer and select Properties. Visual Studio will show the Property Pages dialog box for the project. Then, select Configuration Properties | Manifest Tool | Input and Output | DPI Awareness, select High DPI Aware from the dropdown menu and click OK. You can achieve the same effect by merging in a manifest file with the following XML to the application manifest. Notice that the <code>true</code> value for<code>dpiAware</code> indicates that the application is system DPI-aware.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_364544" class="syntaxhighlighter  xml">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="xml plain">&lt;?</code><code class="xml keyword" style="font-weight: bold !important;">xml</code> <code class="xml color1" style="color: gray !important;">version</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"1.0"</code> <code class="xml color1" style="color: gray !important;">encoding</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"UTF-8"</code> <code class="xml color1" style="color: gray !important;">standalone</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"yes"</code><code class="xml plain">?&gt;</code></div>
<div class="line number2 index1 alt1"><code class="xml plain">&lt;</code><code class="xml keyword" style="font-weight: bold !important;">assembly</code> <code class="xml color1" style="color: gray !important;">xmlns</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"urn:schemas-microsoft-com:asm.v1"</code></div>
<div class="line number3 index2 alt2"><code class="xml spaces">  </code><code class="xml color1" style="color: gray !important;">manifestVersion</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"1.0"</code><code class="xml plain">&gt;</code></div>
<div class="line number4 index3 alt1"><code class="xml spaces">  </code><code class="xml plain">&lt;</code><code class="xml keyword" style="font-weight: bold !important;">application</code> <code class="xml color1" style="color: gray !important;">xmlns</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"urn:schemas-microsoft-com:asm.v3"</code><code class="xml plain">&gt;</code></div>
<div class="line number5 index4 alt2"><code class="xml spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword" style="font-weight: bold !important;">windowsSettings</code><code class="xml plain">&gt;</code></div>
<div class="line number6 index5 alt1"><code class="xml spaces">      </code><code class="xml plain">&lt;</code><code class="xml keyword" style="font-weight: bold !important;">dpiAware</code> <code class="xml color1" style="color: gray !important;">xmlns</code><code class="xml plain">=</code><code class="xml string" style="color: blue !important;">"<a style="color: blue !important;" href="http://schemas.microsoft.com/SMI/2005/WindowsSettings">http://schemas.microsoft.com/SMI/2005/WindowsSettings</a>"</code><code class="xml plain">&gt;true&lt;/</code><code class="xml keyword" style="font-weight: bold !important;">dpiAware</code><code class="xml plain">&gt;</code></div>
<div class="line number7 index6 alt2"><code class="xml spaces">    </code><code class="xml plain">&lt;/</code><code class="xml keyword" style="font-weight: bold !important;">windowsSettings</code><code class="xml plain">&gt;</code></div>
<div class="line number8 index7 alt1"><code class="xml spaces">  </code><code class="xml plain">&lt;/</code><code class="xml keyword" style="font-weight: bold !important;">application</code><code class="xml plain">&gt;</code></div>
<div class="line number9 index8 alt2"><code class="xml plain">&lt;/</code><code class="xml keyword" style="font-weight: bold !important;">assembly</code><code class="xml plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>As I explained earlier, in this case, it is easier to use the setting in the dialog box. I&#8217;ll explain how to merge in a manifest file shortly.</p>
<p>Now, execute the application and you will notice the text in the menu bar is crisp and clear. Now, the application is DPI-aware and DWM doesn&#8217;t virtualize it. There is no code to scale the fonts, and therefore, the text in the About… dialog box is probably going to be too small. If you use Process Explorer to check the DPI Awareness value for the generated executable (DPIAware.exe), you will see the <code>System Aware</code> value.</p>
<p>Open the <code>stdafx.h</code> header file and add a line that includes the <code>ShellScalingAPI.h</code> header. It is necessary to make a call to the <code>GetDpiForMonitor</code> API function. The following lines show the resulting code for stdafx.h.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_697849" class="syntaxhighlighter  text">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">#pragma once</code></div>
<div class="line number2 index1 alt1"><code class="text plain">#include "targetver.h"</code></div>
<div class="line number3 index2 alt2"><code class="text plain">#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers</code></div>
<div class="line number4 index3 alt1"><code class="text plain">// Windows Header Files:</code></div>
<div class="line number5 index4 alt2"><code class="text plain">#include &lt;windows.h&gt;</code></div>
<div class="line number6 index5 alt1"></div>
<div class="line number7 index6 alt2"><code class="text plain">// C RunTime Header Files</code></div>
<div class="line number8 index7 alt1"><code class="text plain">#include &lt;stdlib.h&gt;</code></div>
<div class="line number9 index8 alt2"><code class="text plain">#include &lt;malloc.h&gt;</code></div>
<div class="line number10 index9 alt1"><code class="text plain">#include &lt;memory.h&gt;</code></div>
<div class="line number11 index10 alt2"><code class="text plain">#include &lt;tchar.h&gt;</code></div>
<div class="line number12 index11 alt1"></div>
<div class="line number13 index12 alt2"><code class="text plain">// Additional header required to call GetDpiForMonitor, use enumerations and other API calls</code></div>
<div class="line number14 index13 alt1"><code class="text plain">#include &lt;ShellScalingApi.h&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>It is necessary to add <code>shcore.lib</code> in the linker dependencies. You just need to right-click on the project name, select Properties, and then Configuration Properties | Linker | Input | Additional Dependencies. Add <code>shcore.lib;</code> as a prefix to the existing additional dependencies and click OK.</p>
<p>The following lines show the initial code for the DPIAware.cpp source file:</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_253918" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
<div class="line number56 index55 alt1">56</div>
<div class="line number57 index56 alt2">57</div>
<div class="line number58 index57 alt1">58</div>
<div class="line number59 index58 alt2">59</div>
<div class="line number60 index59 alt1">60</div>
<div class="line number61 index60 alt2">61</div>
<div class="line number62 index61 alt1">62</div>
<div class="line number63 index62 alt2">63</div>
<div class="line number64 index63 alt1">64</div>
<div class="line number65 index64 alt2">65</div>
<div class="line number66 index65 alt1">66</div>
<div class="line number67 index66 alt2">67</div>
<div class="line number68 index67 alt1">68</div>
<div class="line number69 index68 alt2">69</div>
<div class="line number70 index69 alt1">70</div>
<div class="line number71 index70 alt2">71</div>
<div class="line number72 index71 alt1">72</div>
<div class="line number73 index72 alt2">73</div>
<div class="line number74 index73 alt1">74</div>
<div class="line number75 index74 alt2">75</div>
<div class="line number76 index75 alt1">76</div>
<div class="line number77 index76 alt2">77</div>
<div class="line number78 index77 alt1">78</div>
<div class="line number79 index78 alt2">79</div>
<div class="line number80 index79 alt1">80</div>
<div class="line number81 index80 alt2">81</div>
<div class="line number82 index81 alt1">82</div>
<div class="line number83 index82 alt2">83</div>
<div class="line number84 index83 alt1">84</div>
<div class="line number85 index84 alt2">85</div>
<div class="line number86 index85 alt1">86</div>
<div class="line number87 index86 alt2">87</div>
<div class="line number88 index87 alt1">88</div>
<div class="line number89 index88 alt2">89</div>
<div class="line number90 index89 alt1">90</div>
<div class="line number91 index90 alt2">91</div>
<div class="line number92 index91 alt1">92</div>
<div class="line number93 index92 alt2">93</div>
<div class="line number94 index93 alt1">94</div>
<div class="line number95 index94 alt2">95</div>
<div class="line number96 index95 alt1">96</div>
<div class="line number97 index96 alt2">97</div>
<div class="line number98 index97 alt1">98</div>
<div class="line number99 index98 alt2">99</div>
<div class="line number100 index99 alt1">100</div>
<div class="line number101 index100 alt2">101</div>
<div class="line number102 index101 alt1">102</div>
<div class="line number103 index102 alt2">103</div>
<div class="line number104 index103 alt1">104</div>
<div class="line number105 index104 alt2">105</div>
<div class="line number106 index105 alt1">106</div>
<div class="line number107 index106 alt2">107</div>
<div class="line number108 index107 alt1">108</div>
<div class="line number109 index108 alt2">109</div>
<div class="line number110 index109 alt1">110</div>
<div class="line number111 index110 alt2">111</div>
<div class="line number112 index111 alt1">112</div>
<div class="line number113 index112 alt2">113</div>
<div class="line number114 index113 alt1">114</div>
<div class="line number115 index114 alt2">115</div>
<div class="line number116 index115 alt1">116</div>
<div class="line number117 index116 alt2">117</div>
<div class="line number118 index117 alt1">118</div>
<div class="line number119 index118 alt2">119</div>
<div class="line number120 index119 alt1">120</div>
<div class="line number121 index120 alt2">121</div>
<div class="line number122 index121 alt1">122</div>
<div class="line number123 index122 alt2">123</div>
<div class="line number124 index123 alt1">124</div>
<div class="line number125 index124 alt2">125</div>
<div class="line number126 index125 alt1">126</div>
<div class="line number127 index126 alt2">127</div>
<div class="line number128 index127 alt1">128</div>
<div class="line number129 index128 alt2">129</div>
<div class="line number130 index129 alt1">130</div>
<div class="line number131 index130 alt2">131</div>
<div class="line number132 index131 alt1">132</div>
<div class="line number133 index132 alt2">133</div>
<div class="line number134 index133 alt1">134</div>
<div class="line number135 index134 alt2">135</div>
<div class="line number136 index135 alt1">136</div>
<div class="line number137 index136 alt2">137</div>
<div class="line number138 index137 alt1">138</div>
<div class="line number139 index138 alt2">139</div>
<div class="line number140 index139 alt1">140</div>
<div class="line number141 index140 alt2">141</div>
<div class="line number142 index141 alt1">142</div>
<div class="line number143 index142 alt2">143</div>
<div class="line number144 index143 alt1">144</div>
<div class="line number145 index144 alt2">145</div>
<div class="line number146 index145 alt1">146</div>
<div class="line number147 index146 alt2">147</div>
<div class="line number148 index147 alt1">148</div>
<div class="line number149 index148 alt2">149</div>
<div class="line number150 index149 alt1">150</div>
<div class="line number151 index150 alt2">151</div>
<div class="line number152 index151 alt1">152</div>
<div class="line number153 index152 alt2">153</div>
<div class="line number154 index153 alt1">154</div>
<div class="line number155 index154 alt2">155</div>
<div class="line number156 index155 alt1">156</div>
<div class="line number157 index156 alt2">157</div>
<div class="line number158 index157 alt1">158</div>
<div class="line number159 index158 alt2">159</div>
<div class="line number160 index159 alt1">160</div>
<div class="line number161 index160 alt2">161</div>
<div class="line number162 index161 alt1">162</div>
<div class="line number163 index162 alt2">163</div>
<div class="line number164 index163 alt1">164</div>
<div class="line number165 index164 alt2">165</div>
<div class="line number166 index165 alt1">166</div>
<div class="line number167 index166 alt2">167</div>
<div class="line number168 index167 alt1">168</div>
<div class="line number169 index168 alt2">169</div>
<div class="line number170 index169 alt1">170</div>
<div class="line number171 index170 alt2">171</div>
<div class="line number172 index171 alt1">172</div>
<div class="line number173 index172 alt2">173</div>
<div class="line number174 index173 alt1">174</div>
<div class="line number175 index174 alt2">175</div>
<div class="line number176 index175 alt1">176</div>
<div class="line number177 index176 alt2">177</div>
<div class="line number178 index177 alt1">178</div>
<div class="line number179 index178 alt2">179</div>
<div class="line number180 index179 alt1">180</div>
<div class="line number181 index180 alt2">181</div>
<div class="line number182 index181 alt1">182</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp comments" style="color: #999999;">// DPIAware.cpp : Defines the entry point for the application.</code></div>
<div class="line number2 index1 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number3 index2 alt2"></div>
<div class="line number4 index3 alt1"><code class="cpp preprocessor" style="color: gray !important;">#include "stdafx.h"</code></div>
<div class="line number5 index4 alt2"><code class="cpp preprocessor" style="color: gray !important;">#include "DPIAware.h"</code></div>
<div class="line number6 index5 alt1"></div>
<div class="line number7 index6 alt2"><code class="cpp preprocessor" style="color: gray !important;">#define MAX_LOADSTRING 100</code></div>
<div class="line number8 index7 alt1"></div>
<div class="line number9 index8 alt2"><code class="cpp comments" style="color: #999999;">// Global Variables:</code></div>
<div class="line number10 index9 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hInst;                                </code><code class="cpp comments" style="color: #999999;">// current instance</code></div>
<div class="line number11 index10 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">TCHAR</code> <code class="cpp plain">szTitle[MAX_LOADSTRING];                  </code><code class="cpp comments" style="color: #999999;">// The title bar text</code></div>
<div class="line number12 index11 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">TCHAR</code> <code class="cpp plain">szWindowClass[MAX_LOADSTRING];            </code><code class="cpp comments" style="color: #999999;">// the main window class name</code></div>
<div class="line number13 index12 alt2"></div>
<div class="line number14 index13 alt1"><code class="cpp comments" style="color: #999999;">// Forward declarations of functions included in this code module:</code></div>
<div class="line number15 index14 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">ATOM</code>                <code class="cpp plain">MyRegisterClass(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hInstance);</code></div>
<div class="line number16 index15 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">BOOL</code>                <code class="cpp plain">InitInstance(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code><code class="cpp plain">);</code></div>
<div class="line number17 index16 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LRESULT</code> <code class="cpp plain">CALLBACK    WndProc(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">WPARAM</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPARAM</code><code class="cpp plain">);</code></div>
<div class="line number18 index17 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">INT_PTR</code> <code class="cpp plain">CALLBACK    About(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">WPARAM</code><code class="cpp plain">, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPARAM</code><code class="cpp plain">);</code></div>
<div class="line number19 index18 alt2"></div>
<div class="line number20 index19 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">APIENTRY _tWinMain(_In_ </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hInstance,</code></div>
<div class="line number21 index20 alt2"><code class="cpp spaces">                     </code><code class="cpp plain">_In_opt_ </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hPrevInstance,</code></div>
<div class="line number22 index21 alt1"><code class="cpp spaces">                     </code><code class="cpp plain">_In_ </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPTSTR</code>    <code class="cpp plain">lpCmdLine,</code></div>
<div class="line number23 index22 alt2"><code class="cpp spaces">                     </code><code class="cpp plain">_In_ </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code>       <code class="cpp plain">nCmdShow)</code></div>
<div class="line number24 index23 alt1"><code class="cpp plain">{</code></div>
<div class="line number25 index24 alt2"><code class="cpp spaces">    </code><code class="cpp plain">UNREFERENCED_PARAMETER(hPrevInstance);</code></div>
<div class="line number26 index25 alt1"><code class="cpp spaces">    </code><code class="cpp plain">UNREFERENCED_PARAMETER(lpCmdLine);</code></div>
<div class="line number27 index26 alt2"></div>
<div class="line number28 index27 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// TODO: Place code here.</code></div>
<div class="line number29 index28 alt2"><code class="cpp spaces">    </code><code class="cpp plain">MSG msg;</code></div>
<div class="line number30 index29 alt1"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HACCEL</code> <code class="cpp plain">hAccelTable;</code></div>
<div class="line number31 index30 alt2"></div>
<div class="line number32 index31 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Initialize global strings</code></div>
<div class="line number33 index32 alt2"><code class="cpp spaces">    </code><code class="cpp plain">LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);</code></div>
<div class="line number34 index33 alt1"><code class="cpp spaces">    </code><code class="cpp plain">LoadString(hInstance, IDC_DPIAWARE, szWindowClass, MAX_LOADSTRING);</code></div>
<div class="line number35 index34 alt2"><code class="cpp spaces">    </code><code class="cpp plain">MyRegisterClass(hInstance);</code></div>
<div class="line number36 index35 alt1"></div>
<div class="line number37 index36 alt2"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Perform application initialization:</code></div>
<div class="line number38 index37 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(!InitInstance (hInstance, nCmdShow))</code></div>
<div class="line number39 index38 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number40 index39 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">FALSE;</code></div>
<div class="line number41 index40 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number42 index41 alt1"></div>
<div class="line number43 index42 alt2"><code class="cpp spaces">    </code><code class="cpp plain">hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DPIAWARE));</code></div>
<div class="line number44 index43 alt1"></div>
<div class="line number45 index44 alt2"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Main message loop:</code></div>
<div class="line number46 index45 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">while</code> <code class="cpp plain">(GetMessage(&amp;msg, NULL, 0, 0))</code></div>
<div class="line number47 index46 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number48 index47 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg))</code></div>
<div class="line number49 index48 alt2"><code class="cpp spaces">        </code><code class="cpp plain">{</code></div>
<div class="line number50 index49 alt1"><code class="cpp spaces">            </code><code class="cpp plain">TranslateMessage(&amp;msg);</code></div>
<div class="line number51 index50 alt2"><code class="cpp spaces">            </code><code class="cpp plain">DispatchMessage(&amp;msg);</code></div>
<div class="line number52 index51 alt1"><code class="cpp spaces">        </code><code class="cpp plain">}</code></div>
<div class="line number53 index52 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number54 index53 alt1"></div>
<div class="line number55 index54 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code><code class="cpp plain">) msg.wParam;</code></div>
<div class="line number56 index55 alt1"><code class="cpp plain">}</code></div>
<div class="line number57 index56 alt2"></div>
<div class="line number58 index57 alt1"></div>
<div class="line number59 index58 alt2"></div>
<div class="line number60 index59 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number61 index60 alt2"><code class="cpp comments" style="color: #999999;">//  FUNCTION: MyRegisterClass()</code></div>
<div class="line number62 index61 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number63 index62 alt2"><code class="cpp comments" style="color: #999999;">//  PURPOSE: Registers the window class.</code></div>
<div class="line number64 index63 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number65 index64 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">ATOM</code> <code class="cpp plain">MyRegisterClass(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hInstance)</code></div>
<div class="line number66 index65 alt1"><code class="cpp plain">{</code></div>
<div class="line number67 index66 alt2"><code class="cpp spaces">    </code><code class="cpp plain">WNDCLASSEX wcex;</code></div>
<div class="line number68 index67 alt1"></div>
<div class="line number69 index68 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.cbSize = </code><code class="cpp keyword bold" style="font-weight: bold !important;">sizeof</code><code class="cpp plain">(WNDCLASSEX);</code></div>
<div class="line number70 index69 alt1"></div>
<div class="line number71 index70 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.style          = CS_HREDRAW | CS_VREDRAW;</code></div>
<div class="line number72 index71 alt1"><code class="cpp spaces">    </code><code class="cpp plain">wcex.lpfnWndProc    = WndProc;</code></div>
<div class="line number73 index72 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.cbClsExtra     = 0;</code></div>
<div class="line number74 index73 alt1"><code class="cpp spaces">    </code><code class="cpp plain">wcex.cbWndExtra     = 0;</code></div>
<div class="line number75 index74 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.hInstance      = hInstance;</code></div>
<div class="line number76 index75 alt1"><code class="cpp spaces">    </code><code class="cpp plain">wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DPIAWARE));</code></div>
<div class="line number77 index76 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);</code></div>
<div class="line number78 index77 alt1"><code class="cpp spaces">    </code><code class="cpp plain">wcex.hbrBackground  = (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HBRUSH</code><code class="cpp plain">)(COLOR_WINDOW+1);</code></div>
<div class="line number79 index78 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_DPIAWARE);</code></div>
<div class="line number80 index79 alt1"><code class="cpp spaces">    </code><code class="cpp plain">wcex.lpszClassName  = szWindowClass;</code></div>
<div class="line number81 index80 alt2"><code class="cpp spaces">    </code><code class="cpp plain">wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));</code></div>
<div class="line number82 index81 alt1"></div>
<div class="line number83 index82 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">RegisterClassEx(&amp;wcex);</code></div>
<div class="line number84 index83 alt1"><code class="cpp plain">}</code></div>
<div class="line number85 index84 alt2"></div>
<div class="line number86 index85 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number87 index86 alt2"><code class="cpp comments" style="color: #999999;">//   FUNCTION: InitInstance(HINSTANCE, int)</code></div>
<div class="line number88 index87 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number89 index88 alt2"><code class="cpp comments" style="color: #999999;">//   PURPOSE: Saves instance handle and creates main window</code></div>
<div class="line number90 index89 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number91 index90 alt2"><code class="cpp comments" style="color: #999999;">//   COMMENTS:</code></div>
<div class="line number92 index91 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number93 index92 alt2"><code class="cpp comments" style="color: #999999;">//        In this function, we save the instance handle in a global variable and</code></div>
<div class="line number94 index93 alt1"><code class="cpp comments" style="color: #999999;">//        create and display the main program window.</code></div>
<div class="line number95 index94 alt2"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number96 index95 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">BOOL</code> <code class="cpp plain">InitInstance(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hInstance, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">nCmdShow)</code></div>
<div class="line number97 index96 alt2"><code class="cpp plain">{</code></div>
<div class="line number98 index97 alt1"><code class="cpp spaces">   </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code> <code class="cpp plain">hWnd;</code></div>
<div class="line number99 index98 alt2"></div>
<div class="line number100 index99 alt1"><code class="cpp spaces">   </code><code class="cpp plain">hInst = hInstance; </code><code class="cpp comments" style="color: #999999;">// Store instance handle in our global variable</code></div>
<div class="line number101 index100 alt2"></div>
<div class="line number102 index101 alt1"><code class="cpp spaces">   </code><code class="cpp plain">hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,</code></div>
<div class="line number103 index102 alt2"><code class="cpp spaces">      </code><code class="cpp plain">CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);</code></div>
<div class="line number104 index103 alt1"></div>
<div class="line number105 index104 alt2"><code class="cpp spaces">   </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(!hWnd)</code></div>
<div class="line number106 index105 alt1"><code class="cpp spaces">   </code><code class="cpp plain">{</code></div>
<div class="line number107 index106 alt2"><code class="cpp spaces">      </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">FALSE;</code></div>
<div class="line number108 index107 alt1"><code class="cpp spaces">   </code><code class="cpp plain">}</code></div>
<div class="line number109 index108 alt2"></div>
<div class="line number110 index109 alt1"><code class="cpp spaces">   </code><code class="cpp plain">ShowWindow(hWnd, nCmdShow);</code></div>
<div class="line number111 index110 alt2"><code class="cpp spaces">   </code><code class="cpp plain">UpdateWindow(hWnd);</code></div>
<div class="line number112 index111 alt1"></div>
<div class="line number113 index112 alt2"><code class="cpp spaces">   </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">TRUE;</code></div>
<div class="line number114 index113 alt1"><code class="cpp plain">}</code></div>
<div class="line number115 index114 alt2"></div>
<div class="line number116 index115 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number117 index116 alt2"><code class="cpp comments" style="color: #999999;">//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)</code></div>
<div class="line number118 index117 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number119 index118 alt2"><code class="cpp comments" style="color: #999999;">//  PURPOSE:  Processes messages for the main window.</code></div>
<div class="line number120 index119 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number121 index120 alt2"><code class="cpp comments" style="color: #999999;">//  WM_COMMAND  - process the application menu</code></div>
<div class="line number122 index121 alt1"><code class="cpp comments" style="color: #999999;">//  WM_PAINT    - Paint the main window</code></div>
<div class="line number123 index122 alt2"><code class="cpp comments" style="color: #999999;">//  WM_DESTROY  - post a quit message and return</code></div>
<div class="line number124 index123 alt1"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number125 index124 alt2"><code class="cpp comments" style="color: #999999;">//</code></div>
<div class="line number126 index125 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LRESULT</code> <code class="cpp plain">CALLBACK WndProc(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code> <code class="cpp plain">hWnd, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code> <code class="cpp plain">message, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">WPARAM</code> <code class="cpp plain">wParam, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPARAM</code> <code class="cpp plain">lParam)</code></div>
<div class="line number127 index126 alt2"><code class="cpp plain">{</code></div>
<div class="line number128 index127 alt1"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">wmId, wmEvent;</code></div>
<div class="line number129 index128 alt2"><code class="cpp spaces">    </code><code class="cpp plain">PAINTSTRUCT ps;</code></div>
<div class="line number130 index129 alt1"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HDC</code> <code class="cpp plain">hdc;</code></div>
<div class="line number131 index130 alt2"></div>
<div class="line number132 index131 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">switch</code> <code class="cpp plain">(message)</code></div>
<div class="line number133 index132 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number134 index133 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">WM_COMMAND:</code></div>
<div class="line number135 index134 alt2"><code class="cpp spaces">        </code><code class="cpp plain">wmId    = LOWORD(wParam);</code></div>
<div class="line number136 index135 alt1"><code class="cpp spaces">        </code><code class="cpp plain">wmEvent = HIWORD(wParam);</code></div>
<div class="line number137 index136 alt2"><code class="cpp spaces">        </code><code class="cpp comments" style="color: #999999;">// Parse the menu selections:</code></div>
<div class="line number138 index137 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">switch</code> <code class="cpp plain">(wmId)</code></div>
<div class="line number139 index138 alt2"><code class="cpp spaces">        </code><code class="cpp plain">{</code></div>
<div class="line number140 index139 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">IDM_ABOUT:</code></div>
<div class="line number141 index140 alt2"><code class="cpp spaces">            </code><code class="cpp plain">DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);</code></div>
<div class="line number142 index141 alt1"><code class="cpp spaces">            </code><code class="cpp keyword bold" style="font-weight: bold !important;">break</code><code class="cpp plain">;</code></div>
<div class="line number143 index142 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">IDM_EXIT:</code></div>
<div class="line number144 index143 alt1"><code class="cpp spaces">            </code><code class="cpp plain">DestroyWindow(hWnd);</code></div>
<div class="line number145 index144 alt2"><code class="cpp spaces">            </code><code class="cpp keyword bold" style="font-weight: bold !important;">break</code><code class="cpp plain">;</code></div>
<div class="line number146 index145 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">default</code><code class="cpp plain">:</code></div>
<div class="line number147 index146 alt2"><code class="cpp spaces">            </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">DefWindowProc(hWnd, message, wParam, lParam);</code></div>
<div class="line number148 index147 alt1"><code class="cpp spaces">        </code><code class="cpp plain">}</code></div>
<div class="line number149 index148 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">break</code><code class="cpp plain">;</code></div>
<div class="line number150 index149 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">WM_PAINT:</code></div>
<div class="line number151 index150 alt2"><code class="cpp spaces">        </code><code class="cpp plain">hdc = BeginPaint(hWnd, &amp;ps);</code></div>
<div class="line number152 index151 alt1"><code class="cpp spaces">        </code><code class="cpp comments" style="color: #999999;">// TODO: Add any drawing code here...</code></div>
<div class="line number153 index152 alt2"><code class="cpp spaces">        </code><code class="cpp plain">EndPaint(hWnd, &amp;ps);</code></div>
<div class="line number154 index153 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">break</code><code class="cpp plain">;</code></div>
<div class="line number155 index154 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">WM_DESTROY:</code></div>
<div class="line number156 index155 alt1"><code class="cpp spaces">        </code><code class="cpp plain">PostQuitMessage(0);</code></div>
<div class="line number157 index156 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">break</code><code class="cpp plain">;</code></div>
<div class="line number158 index157 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">default</code><code class="cpp plain">:</code></div>
<div class="line number159 index158 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">DefWindowProc(hWnd, message, wParam, lParam);</code></div>
<div class="line number160 index159 alt1"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number161 index160 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">0;</code></div>
<div class="line number162 index161 alt1"><code class="cpp plain">}</code></div>
<div class="line number163 index162 alt2"></div>
<div class="line number164 index163 alt1"><code class="cpp comments" style="color: #999999;">// Message handler for about box.</code></div>
<div class="line number165 index164 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">INT_PTR</code> <code class="cpp plain">CALLBACK About(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code> <code class="cpp plain">hDlg, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code> <code class="cpp plain">message, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">WPARAM</code> <code class="cpp plain">wParam, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPARAM</code> <code class="cpp plain">lParam)</code></div>
<div class="line number166 index165 alt1"><code class="cpp plain">{</code></div>
<div class="line number167 index166 alt2"><code class="cpp spaces">    </code><code class="cpp plain">UNREFERENCED_PARAMETER(lParam);</code></div>
<div class="line number168 index167 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">switch</code> <code class="cpp plain">(message)</code></div>
<div class="line number169 index168 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number170 index169 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">WM_INITDIALOG:</code></div>
<div class="line number171 index170 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">INT_PTR</code><code class="cpp plain">)TRUE;</code></div>
<div class="line number172 index171 alt1"></div>
<div class="line number173 index172 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">case</code> <code class="cpp plain">WM_COMMAND:</code></div>
<div class="line number174 index173 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)</code></div>
<div class="line number175 index174 alt2"><code class="cpp spaces">        </code><code class="cpp plain">{</code></div>
<div class="line number176 index175 alt1"><code class="cpp spaces">            </code><code class="cpp plain">EndDialog(hDlg, LOWORD(wParam));</code></div>
<div class="line number177 index176 alt2"><code class="cpp spaces">            </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">INT_PTR</code><code class="cpp plain">)TRUE;</code></div>
<div class="line number178 index177 alt1"><code class="cpp spaces">        </code><code class="cpp plain">}</code></div>
<div class="line number179 index178 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">break</code><code class="cpp plain">;</code></div>
<div class="line number180 index179 alt1"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number181 index180 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">INT_PTR</code><code class="cpp plain">)FALSE;</code></div>
<div class="line number182 index181 alt1"><code class="cpp plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<div class="story">
<article>If you add the following lines to the <code>_tWinMain</code> function, you will notice the <code>isSystemDPIAware</code>variable holds the <code>true</code> value because the call to <code>GetProcessDpiAwareness</code> returns<code>PROCESS_SYSTEM_DPI_AWARE</code> in the <code>awareness</code> variable.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_277014" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">PROCESS_DPI_AWARENESS awareness;</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">auto hProcess = OpenProcess(PROCESS_ALL_ACCESS, </code><code class="cpp keyword bold" style="font-weight: bold !important;">false</code><code class="cpp plain">, GetCurrentProcessId());</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">auto hr = GetProcessDpiAwareness(hProcess, &amp;awareness);</code></div>
<div class="line number4 index3 alt1"><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(hr != S_OK)</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">{</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">    </code><code class="cpp plain">MessageBox(NULL, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"GetProcessDpiAwareness failed"</code><code class="cpp plain">, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"Notification"</code><code class="cpp plain">, MB_OK);</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">FALSE;</code></div>
<div class="line number8 index7 alt1"><code class="cpp plain">}</code></div>
<div class="line number9 index8 alt2"><code class="cpp plain">auto isSystemDPIAware = (awareness == PROCESS_SYSTEM_DPI_AWARE);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The following lines make a call to <code>GetDpiForMonitor</code> to retrieve the DPI for the monitor in which the application window is running. If you add these lines to the <code>InitInstance</code> function, you will be able to check that the <code>dpiX</code> and <code>dpiY</code> values are different from 96 because the system DPI aware process isn&#8217;t running on a virtualized 96 DPI environment. For example, if your monitor configuration has an extra large scaling of 200% or 192 DPI, the value for <code>dpiX</code> will be 192 and you can use this value to scale your content. The <code>MDT_EFFECTIVE_DPI</code> value specifies that you want the effective DPI that incorporates accessibility overrides and matches what DWM uses to scale desktop applications.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_684978" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">POINT    point;</code></div>
<div class="line number2 index1 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code>     <code class="cpp plain">dpiX = 0, dpiY = 0;</code></div>
<div class="line number3 index2 alt2"></div>
<div class="line number4 index3 alt1"><code class="cpp plain">point.x = 1;</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">point.y = 1;</code></div>
<div class="line number6 index5 alt1"><code class="cpp plain">auto hMonitor = MonitorFromPoint(point, MONITOR_DEFAULTTONEAREST);</code></div>
<div class="line number7 index6 alt2"><code class="cpp plain">auto hr = GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &amp;dpiX, &amp;dpiY);</code></div>
<div class="line number8 index7 alt1"></div>
<div class="line number9 index8 alt2"><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(hr != S_OK)</code></div>
<div class="line number10 index9 alt1"><code class="cpp plain">{</code></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">    </code><code class="cpp plain">MessageBox(NULL, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"GetDpiForMonitor failed"</code><code class="cpp plain">, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"Notification"</code><code class="cpp plain">, MB_OK);</code></div>
<div class="line number12 index11 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">FALSE;</code></div>
<div class="line number13 index12 alt2"><code class="cpp plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>It is a good idea to use a scale helper class with all the necessary methods to simplify the process of scaling the different values and elements. The following lines show the code for a sample<code>ScaleHelper</code> class. You need to provide the DPI retrieved from the monitor to the <code>SetScaleFactor</code>method in order to allow the class to calculate the appropriate scale factor and store it in<code>m_nScaleFactor</code>. For example, if the DPI is equal to <code>192</code>, the value for <code>m_nScaleFactor</code> will be <code>200</code>. Then, you can call different methods to scale from raw pixels to relative pixels by using the calculated scale factor:</p>
<ul>
<li><code>ScaleValue</code>: Scales a single value.</li>
<li><code>ScalePoint</code>: Scales the <code>x</code> and <code>y</code> components of a <code>POINT</code>.</li>
<li><code>ScaleRectangle</code>: Scales the <code>left</code>, <code>right</code>, <code>top</code>, and <code>bottom</code> components of a <code>RECT</code>.</li>
<li><code>CreateScaledFont</code>: Receives a raw height value and scales it to create a logical font close to this scaled height.</li>
</ul>
<p>&nbsp;</p>
<div>
<div id="highlighter_31956" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold" style="font-weight: bold !important;">class</code> <code class="cpp plain">ScaleHelper</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp keyword bold" style="font-weight: bold !important;">public</code><code class="cpp plain">:</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">    </code><code class="cpp plain">ScaleHelper()</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">        </code><code class="cpp plain">m_nScaleFactor = 0;</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number8 index7 alt1"></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code> <code class="cpp plain">GetScaleFactor()</code></div>
<div class="line number10 index9 alt1"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">m_nScaleFactor;</code></div>
<div class="line number12 index11 alt1"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number13 index12 alt2"></div>
<div class="line number14 index13 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">void</code> <code class="cpp plain">SetScaleFactor(__in </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code> <code class="cpp plain">iDPI)</code></div>
<div class="line number15 index14 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number16 index15 alt1"><code class="cpp spaces">        </code><code class="cpp plain">m_nScaleFactor = MulDiv(iDPI, 100, 96);</code></div>
<div class="line number17 index16 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number18 index17 alt1"></div>
<div class="line number19 index18 alt2"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">ScaleValue(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">value)</code></div>
<div class="line number20 index19 alt1"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number21 index20 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">MulDiv(value, m_nScaleFactor, 100);</code></div>
<div class="line number22 index21 alt1"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number23 index22 alt2"></div>
<div class="line number24 index23 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Scale rectangle from raw pixels to relative pixels.</code></div>
<div class="line number25 index24 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">void</code> <code class="cpp plain">ScaleRectangle(__inout RECT *pRectangle)</code></div>
<div class="line number26 index25 alt1"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number27 index26 alt2"><code class="cpp spaces">        </code><code class="cpp plain">pRectangle-&gt;left = ScaleValue(pRectangle-&gt;left);</code></div>
<div class="line number28 index27 alt1"><code class="cpp spaces">        </code><code class="cpp plain">pRectangle-&gt;right = ScaleValue(pRectangle-&gt;right);</code></div>
<div class="line number29 index28 alt2"><code class="cpp spaces">        </code><code class="cpp plain">pRectangle-&gt;top = ScaleValue(pRectangle-&gt;top);</code></div>
<div class="line number30 index29 alt1"><code class="cpp spaces">        </code><code class="cpp plain">pRectangle-&gt;bottom = ScaleValue(pRectangle-&gt;bottom);</code></div>
<div class="line number31 index30 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number32 index31 alt1"></div>
<div class="line number33 index32 alt2"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Scale Point from raw pixels to relative pixels.</code></div>
<div class="line number34 index33 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">void</code> <code class="cpp plain">ScalePoint(__inout POINT *pPoint)</code></div>
<div class="line number35 index34 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number36 index35 alt1"><code class="cpp spaces">        </code><code class="cpp plain">pPoint-&gt;x = ScaleValue(pPoint-&gt;x);</code></div>
<div class="line number37 index36 alt2"><code class="cpp spaces">        </code><code class="cpp plain">pPoint-&gt;y = ScaleValue(pPoint-&gt;y);</code></div>
<div class="line number38 index37 alt1"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number39 index38 alt2"></div>
<div class="line number40 index39 alt1"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HFONT</code> <code class="cpp plain">CreateScaledFont(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">nFontHeight)</code></div>
<div class="line number41 index40 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number42 index41 alt1"><code class="cpp spaces">        </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">nScaledFontHeight = ScaleValue(nFontHeight);</code></div>
<div class="line number43 index42 alt2"><code class="cpp spaces">        </code><code class="cpp plain">LOGFONT lf;</code></div>
<div class="line number44 index43 alt1"><code class="cpp spaces">        </code><code class="cpp functions bold" style="font-weight: bold !important; color: #ff1493 !important;">memset</code><code class="cpp plain">(&amp;lf, 0, </code><code class="cpp keyword bold" style="font-weight: bold !important;">sizeof</code><code class="cpp plain">(lf));</code></div>
<div class="line number45 index44 alt2"><code class="cpp spaces">        </code><code class="cpp plain">lf.lfQuality = CLEARTYPE_QUALITY;</code></div>
<div class="line number46 index45 alt1"><code class="cpp spaces">        </code><code class="cpp plain">lf.lfHeight = -nScaledFontHeight;</code></div>
<div class="line number47 index46 alt2"><code class="cpp spaces">        </code><code class="cpp plain">auto hFont = CreateFontIndirect(&amp;lf);</code></div>
<div class="line number48 index47 alt1"><code class="cpp spaces">        </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">hFont;</code></div>
<div class="line number49 index48 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number50 index49 alt1"></div>
<div class="line number51 index50 alt2"><code class="cpp keyword bold" style="font-weight: bold !important;">private</code><code class="cpp plain">:</code></div>
<div class="line number52 index51 alt1"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code> <code class="cpp plain">m_nScaleFactor;</code></div>
<div class="line number53 index52 alt2"><code class="cpp plain">};</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>The following lines define the baseline padding and sizes for the window, the button, and the fonts. These are the default values for 96 DPI or 100% scaling. In addition, I define a global variable to call the <code>ScaleHelper</code> class methods within different functions and store two <code>HFONT</code> for the window text and the button text.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_281288" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp preprocessor" style="color: gray !important;">#define BASELINE_PADDING    15</code></div>
<div class="line number2 index1 alt1"><code class="cpp preprocessor" style="color: gray !important;">#define BASELINE_WINDOW_WIDTH       800</code></div>
<div class="line number3 index2 alt2"><code class="cpp preprocessor" style="color: gray !important;">#define BASELINE_WINDOW_HEIGHT      500</code></div>
<div class="line number4 index3 alt1"><code class="cpp preprocessor" style="color: gray !important;">#define BASELINE_BUTTON_WIDTH       280</code></div>
<div class="line number5 index4 alt2"><code class="cpp preprocessor" style="color: gray !important;">#define BASELINE_BUTTON_HEIGHT      60</code></div>
<div class="line number6 index5 alt1"><code class="cpp preprocessor" style="color: gray !important;">#define BASELINE_FONT_HEIGHT 30</code></div>
<div class="line number7 index6 alt2"></div>
<div class="line number8 index7 alt1"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code>      <code class="cpp plain">g_nBaselineFontHeight = BASELINE_FONT_HEIGHT;</code></div>
<div class="line number9 index8 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HFONT</code>     <code class="cpp plain">g_hTextFont, g_hButtonFont;</code></div>
<div class="line number10 index9 alt1"><code class="cpp plain">ScaleHelper      g_ScaleHelper;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>The <code>CreateFonts</code> function calls the <code>ScaleHelper.CreateScaledFont</code> method twice to create fonts for the window text (<code>g_hTextFont</code>) and button text (<code>g_hButtonFont</code>). The function can be called many times if there are changes in the DPI settings (and when it is necessary to cleanup the existing fonts and create new fonts based on the new scale). In this case, the application is system DPI-aware, but the code for this function is ready to be reused when I convert this application to a per-monitor DPI aware one.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_496522" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold" style="font-weight: bold !important;">void</code> <code class="cpp plain">CreateFonts(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code> <code class="cpp plain">hWnd)</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(g_hTextFont != NULL)</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">        </code><code class="cpp plain">DeleteObject(g_hTextFont);</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">        </code><code class="cpp plain">g_hTextFont = NULL;</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number8 index7 alt1"></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">    </code><code class="cpp plain">g_hTextFont = g_ScaleHelper.CreateScaledFont(g_nBaselineFontHeight);</code></div>
<div class="line number10 index9 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(g_hTextFont == NULL)</code></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number12 index11 alt1"><code class="cpp spaces">        </code><code class="cpp plain">MessageBox(hWnd, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"CreateScaledFont failed"</code><code class="cpp plain">, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"Notification"</code><code class="cpp plain">, MB_OK);</code></div>
<div class="line number13 index12 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number14 index13 alt1"></div>
<div class="line number15 index14 alt2"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(g_hButtonFont != NULL)</code></div>
<div class="line number16 index15 alt1"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number17 index16 alt2"><code class="cpp spaces">        </code><code class="cpp plain">DeleteObject(g_hButtonFont);</code></div>
<div class="line number18 index17 alt1"><code class="cpp spaces">        </code><code class="cpp plain">g_hButtonFont = NULL;</code></div>
<div class="line number19 index18 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number20 index19 alt1"></div>
<div class="line number21 index20 alt2"><code class="cpp spaces">    </code><code class="cpp plain">g_hButtonFont = g_ScaleHelper.CreateScaledFont(BASELINE_FONT_HEIGHT);</code></div>
<div class="line number22 index21 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(g_hButtonFont == NULL)</code></div>
<div class="line number23 index22 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number24 index23 alt1"><code class="cpp spaces">        </code><code class="cpp plain">MessageBox(hWnd, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"CreateScaledFont failed"</code><code class="cpp plain">, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"Notification"</code><code class="cpp plain">, MB_OK);</code></div>
<div class="line number25 index24 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number26 index25 alt1"><code class="cpp plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>The <code>RenderWindow</code> function draws different elements of the window: the background color, two lines of text, and a button. The function calls the <code>ScaleHelper.ScaleValue</code> method to scale the different baseline values based on the DPI settings and uses the fonts for the window text (<code>g_hTextFont</code>) and button text (<code>g_hButtonFont</code>) created by the <code>CreateFonts</code> function. If the DPI settings changes, it is possible to call <code>RenderWindow</code> to update the elements based on the new DPI settings. This way, the <code>RenderWindow</code> function can be reused in the conversion to a per monitor DPI aware application.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_350946" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold" style="font-weight: bold !important;">void</code> <code class="cpp plain">RenderWindow(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code> <code class="cpp plain">hWnd)</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">    </code><code class="cpp plain">PAINTSTRUCT ps;</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">    </code><code class="cpp plain">RECT        rcText, rcWindow, rcClient;</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code>     <code class="cpp plain">text1 = L</code><code class="cpp string" style="color: blue !important;">"Line #1: Sample scaled text"</code><code class="cpp plain">;</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">    </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code>     <code class="cpp plain">text2 = L</code><code class="cpp string" style="color: blue !important;">"Line #2: Sample scaled text"</code><code class="cpp plain">;</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">    </code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Cornflower blue background color</code></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">    </code><code class="cpp plain">auto color = RGB(100, 149, 237);</code></div>
<div class="line number10 index9 alt1"></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">    </code><code class="cpp plain">GetWindowRect(hWnd, &amp;rcWindow);</code></div>
<div class="line number12 index11 alt1"><code class="cpp spaces">    </code><code class="cpp plain">GetClientRect(hWnd, &amp;rcClient);</code></div>
<div class="line number13 index12 alt2"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Scale the baseline padding value</code></div>
<div class="line number14 index13 alt1"><code class="cpp spaces">    </code><code class="cpp plain">auto nScaledPadding = g_ScaleHelper.ScaleValue(BASELINE_PADDING);</code></div>
<div class="line number15 index14 alt2"><code class="cpp spaces">    </code><code class="cpp plain">auto hdc = BeginPaint(hWnd, &amp;ps);</code></div>
<div class="line number16 index15 alt1"><code class="cpp spaces">    </code><code class="cpp plain">SetBkMode(hdc, TRANSPARENT);</code></div>
<div class="line number17 index16 alt2"><code class="cpp spaces">    </code><code class="cpp plain">auto hBrush = CreateSolidBrush(color);</code></div>
<div class="line number18 index17 alt1"><code class="cpp spaces">    </code><code class="cpp plain">FillRect(hdc, &amp;rcClient, hBrush);</code></div>
<div class="line number19 index18 alt2"></div>
<div class="line number20 index19 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Render a button with the scaled text</code></div>
<div class="line number21 index20 alt2"><code class="cpp spaces">    </code><code class="cpp plain">SelectObject(hdc, g_hButtonFont);</code></div>
<div class="line number22 index21 alt1"><code class="cpp spaces">    </code><code class="cpp plain">auto hWndButton = GetWindow(hWnd, GW_CHILD);</code></div>
<div class="line number23 index22 alt2"><code class="cpp spaces">    </code><code class="cpp plain">SetWindowPos(hWndButton, HWND_TOP, rcClient.left + nScaledPadding, rcClient.bottom - g_ScaleHelper.ScaleValue(BASELINE_BUTTON_HEIGHT) - nScaledPadding,</code></div>
<div class="line number24 index23 alt1"><code class="cpp spaces">        </code><code class="cpp plain">g_ScaleHelper.ScaleValue(BASELINE_BUTTON_WIDTH), g_ScaleHelper.ScaleValue(BASELINE_BUTTON_HEIGHT), SWP_SHOWWINDOW);</code></div>
<div class="line number25 index24 alt2"><code class="cpp spaces">    </code><code class="cpp plain">SendMessage(hWndButton, WM_SETFONT, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">WPARAM</code><code class="cpp plain">)g_hButtonFont, TRUE);</code></div>
<div class="line number26 index25 alt1"><code class="cpp spaces">    </code><code class="cpp plain">UpdateWindow(hWndButton);</code></div>
<div class="line number27 index26 alt2"></div>
<div class="line number28 index27 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Render two lines of text within the Window</code></div>
<div class="line number29 index28 alt2"><code class="cpp spaces">    </code><code class="cpp plain">SelectObject(hdc, g_hTextFont);</code></div>
<div class="line number30 index29 alt1"><code class="cpp spaces">    </code><code class="cpp plain">rcText.left = rcClient.left + nScaledPadding;</code></div>
<div class="line number31 index30 alt2"><code class="cpp spaces">    </code><code class="cpp plain">rcText.top = rcClient.top + nScaledPadding;</code></div>
<div class="line number32 index31 alt1"><code class="cpp spaces">    </code><code class="cpp plain">DrawText(hdc, text1, -1, &amp;rcText, DT_CALCRECT | DT_LEFT | DT_TOP);</code></div>
<div class="line number33 index32 alt2"><code class="cpp spaces">    </code><code class="cpp plain">DrawText(hdc, text1, -1, &amp;rcText, DT_LEFT | DT_TOP);</code></div>
<div class="line number34 index33 alt1"><code class="cpp spaces">    </code><code class="cpp plain">rcText.top = rcText.bottom + nScaledPadding;</code></div>
<div class="line number35 index34 alt2"><code class="cpp spaces">    </code><code class="cpp plain">DrawText(hdc, text2, -1, &amp;rcText, DT_CALCRECT | DT_LEFT | DT_TOP);</code></div>
<div class="line number36 index35 alt1"><code class="cpp spaces">    </code><code class="cpp plain">DrawText(hdc, text2, -1, &amp;rcText, DT_LEFT | DT_TOP);</code></div>
<div class="line number37 index36 alt2"></div>
<div class="line number38 index37 alt1"><code class="cpp spaces">    </code><code class="cpp comments" style="color: #999999;">// Cleanup code</code></div>
<div class="line number39 index38 alt2"><code class="cpp spaces">    </code><code class="cpp plain">EndPaint(hWnd, &amp;ps);</code></div>
<div class="line number40 index39 alt1"><code class="cpp spaces">    </code><code class="cpp plain">DeleteObject(hBrush);</code></div>
<div class="line number41 index40 alt2"><code class="cpp spaces">    </code><code class="cpp plain">DeleteDC(hdc);</code></div>
<div class="line number42 index41 alt1"><code class="cpp plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>It is necessary to change the code for the <code>InitInstance</code> function. First, I add the previously shown lines that retrieve the DPI for the monitor in which the application window is going to be displayed. Then, I use the scale helper class to calculate the appropriate scale factor based on the retrieved DPI value, and I replace the code that creates the main window with new code that scales the baseline width (<code>BASELINE_WINDOW_WIDTH</code>) and height (<code>BASELINE_WINDOW_HEIGHT</code>) to create the window with the appropriate scaled size. In addition, the new code calls the previously explained <code>CreateFonts</code> function.</p>
<p>&nbsp;</p>
<div>
<div id="highlighter_528720" class="syntaxhighlighter  cpp">
<div class="toolbar" style="color: white !important;"><a class="toolbar_item command_help help" style="color: white !important;" href="http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=2#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter" style="color: #afafaf !important;">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">BOOL</code> <code class="cpp plain">InitInstance(</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HINSTANCE</code> <code class="cpp plain">hInstance, </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">int</code> <code class="cpp plain">nCmdShow)</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">   </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">HWND</code> <code class="cpp plain">hWnd;</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">   </code><code class="cpp plain">POINT    point;</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">   </code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">UINT</code>     <code class="cpp plain">dpiX = 0, dpiY = 0;</code></div>
<div class="line number6 index5 alt1"></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">   </code><code class="cpp comments" style="color: #999999;">// Get the DPI for the main monitor, and set the scaling factor</code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">   </code><code class="cpp plain">point.x = 1;</code></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">   </code><code class="cpp plain">point.y = 1;</code></div>
<div class="line number10 index9 alt1"><code class="cpp spaces">   </code><code class="cpp plain">auto hMonitor = MonitorFromPoint(point, MONITOR_DEFAULTTONEAREST);</code></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">   </code><code class="cpp plain">auto hr = GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &amp;dpiX, &amp;dpiY);</code></div>
<div class="line number12 index11 alt1"></div>
<div class="line number13 index12 alt2"><code class="cpp spaces">   </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(hr != S_OK)</code></div>
<div class="line number14 index13 alt1"><code class="cpp spaces">   </code><code class="cpp plain">{</code></div>
<div class="line number15 index14 alt2"><code class="cpp spaces">       </code><code class="cpp plain">MessageBox(NULL, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"GetDpiForMonitor failed"</code><code class="cpp plain">, (</code><code class="cpp color1 bold" style="font-weight: bold !important; color: gray !important;">LPCWSTR</code><code class="cpp plain">)L</code><code class="cpp string" style="color: blue !important;">"Notification"</code><code class="cpp plain">, MB_OK);</code></div>
<div class="line number16 index15 alt1"><code class="cpp spaces">       </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">FALSE;</code></div>
<div class="line number17 index16 alt2"><code class="cpp spaces">   </code><code class="cpp plain">}</code></div>
<div class="line number18 index17 alt1"></div>
<div class="line number19 index18 alt2"><code class="cpp spaces">   </code><code class="cpp comments" style="color: #999999;">// Use the scale helper class to calculate the appropriate scale factor based on the retrieved DPI value</code></div>
<div class="line number20 index19 alt1"><code class="cpp spaces">   </code><code class="cpp plain">g_ScaleHelper.SetScaleFactor(dpiX);</code></div>
<div class="line number21 index20 alt2"></div>
<div class="line number22 index21 alt1"><code class="cpp spaces">   </code><code class="cpp comments" style="color: #999999;">// Store instance handle in our global variable</code></div>
<div class="line number23 index22 alt2"><code class="cpp spaces">   </code><code class="cpp plain">hInst = hInstance;</code></div>
<div class="line number24 index23 alt1"></div>
<div class="line number25 index24 alt2"><code class="cpp spaces">   </code><code class="cpp comments" style="color: #999999;">// Create main window and pushbutton window</code></div>
<div class="line number26 index25 alt1"><code class="cpp spaces">   </code><code class="cpp plain">hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, g_ScaleHelper.ScaleValue(100), g_ScaleHelper.ScaleValue(100),</code></div>
<div class="line number27 index26 alt2"><code class="cpp spaces">       </code><code class="cpp plain">g_ScaleHelper.ScaleValue(BASELINE_WINDOW_WIDTH), g_ScaleHelper.ScaleValue(BASELINE_WINDOW_HEIGHT), NULL, NULL, hInstance, NULL);</code></div>
<div class="line number28 index27 alt1"></div>
<div class="line number29 index28 alt2"><code class="cpp spaces">   </code><code class="cpp keyword bold" style="font-weight: bold !important;">if</code> <code class="cpp plain">(!hWnd)</code></div>
<div class="line number30 index29 alt1"><code class="cpp spaces">   </code><code class="cpp plain">{</code></div>
<div class="line number31 index30 alt2"><code class="cpp spaces">       </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">FALSE;</code></div>
<div class="line number32 index31 alt1"><code class="cpp spaces">   </code><code class="cpp plain">}</code></div>
<div class="line number33 index32 alt2"><code class="cpp spaces">   </code></div>
<div class="line number34 index33 alt1"><code class="cpp spaces">   </code><code class="cpp plain">auto hWndButton = CreateWindow(L</code><code class="cpp string" style="color: blue !important;">"BUTTON"</code><code class="cpp plain">, L</code><code class="cpp string" style="color: blue !important;">"Scaled button text"</code><code class="cpp plain">, WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 0, 0, 0, 0, hWnd, NULL, hInstance, NULL);</code></div>
<div class="line number35 index34 alt2"></div>
<div class="line number36 index35 alt1"><code class="cpp spaces">   </code><code class="cpp comments" style="color: #999999;">// Create the scaled fonts for the window text and the button text</code></div>
<div class="line number37 index36 alt2"><code class="cpp spaces">   </code><code class="cpp plain">CreateFonts(hWnd);</code></div>
<div class="line number38 index37 alt1"></div>
<div class="line number39 index38 alt2"><code class="cpp spaces">   </code><code class="cpp plain">ShowWindow(hWnd, nCmdShow);</code></div>
<div class="line number40 index39 alt1"><code class="cpp spaces">   </code><code class="cpp plain">UpdateWindow(hWnd);</code></div>
<div class="line number41 index40 alt2"></div>
<div class="line number42 index41 alt1"><code class="cpp spaces">   </code><code class="cpp keyword bold" style="font-weight: bold !important;">return</code> <code class="cpp plain">TRUE;</code></div>
<div class="line number43 index42 alt2"><code class="cpp plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p>Finally, it is necessary to change the code that is executed with the <code>WM_PAINT</code> message in the<code>WndProc</code> function with the following code that calls the <code>RenderWindow</code> function:</p>
<p>&nbsp;</p><pre class="crayon-plain-tag">case WM_PAINT:
	RenderWindow(hWnd);
	break;</pre><p>&nbsp;</p>
<p>The result of all this code is simple — a window that scales its size and its fonts to display crisp and clear text for the different DPI levels (see Figure 1).</p>
<p><img title="windows display" src="http://twimgs.com/ddj/images/article/2014/0714/DPI2Fig1.gif" alt="WindowsDisplay" width="400" /><br />
<b>Figure 1: The sample application window scaled to 192 DPI and displaying crisp text.</b></p>
<p>&nbsp;</p>
<h3>Creating a Per-Monitor DPI Aware Win32 Application</h3>
<p>If you move the window to a monitor with a different DPI setting, DWM will scale up or down the application and you will see blurry text on the new display. If I want this simple application to adapt itself to a different display or to dynamic changes in the DPI settings, it is necessary to change its manifest file to convert it to a per-monitor DPI aware application and make a few small changes in the code to listen for changes in the DPI settings or scale factor. The use of a scale helper class will make it easy to perform the conversion.</p>
<p>The following lines add the code that has to be executed with the <code>WM_DPICHANGED</code> message in the<code>WndProc</code> function. This message tells the program that most of its window is on a monitor with a new DPI setting. The <code>wParam</code> contains the new DPI setting and the <code>lParam</code> contains a window rectangle scaled for the new DPI. It is necessary to ask the scale helper to recalculate the scale based on the new DPI setting, resize the window, create scaled fonts, and render again the window content.</p>
<p>&nbsp;</p><pre class="crayon-plain-tag">case WM_DPICHANGED:
	// wParam = New DPI setting
	// lParam = Window rectangle scaled for the new DPI
	// Use the new DPI retrieved from the wParam to calculate the new scale factor
	g_ScaleHelper.SetScaleFactor(LOWORD(wParam));
	// Get the window rectangle scaled for the new DPI, retrieved from the lParam
LPRECT lprcNewScale;
	lprcNewScale = (LPRECT)lParam;
	// Resize the window for the new DPI setting
	SetWindowPos(hWnd, HWND_TOP, lprcNewScale-&amp;gt;left, lprcNewScale-&amp;gt;top, RectWidth(*lprcNewScale), RectHeight(*lprcNewScale), SWP_NOZORDER | SWP_NOACTIVATE);
	// Create new scaled fonts for the new DPI setting
	CreateFonts(hWnd);
	// Render the window contents again
	RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
	break;</pre><p>&nbsp;</p>
<p>Right-click on the project name (<code>DPIAware</code>) within Solution Explorer and select Properties. Visual Studio will show the Property Pages dialog box for the project. Then, select Configuration Properties | Manifest Tool | Input and Output | DPI Awareness, select Per Monitor High DPI Aware from the dropdown menu, and click OK. Execute the application, and perform one of the following actions:</p>
<ul>
<li>Change the DPI settings for the display in which the application is showing the window.</li>
<li>Move the application window to another display with a different DPI setting than the display in which the application started.</li>
</ul>
<p>You will see how the application changes its window, button, and text sizes and keeps displaying crisp text, taking full advantage of the new DPI setting (see Figure 2).</p>
<p><img title="windows display" src="http://twimgs.com/ddj/images/article/2014/0714/DPI2Fig2.gif" alt="WindowsDisplay" width="400" /><br />
<b>Figure 2: The sample application window scaled to 240 DPI and displaying crisp text.</b></p>
<p>However, there is a small problem with the value generated for the manifest file. Now, the application is per-monitor DPI-aware, but in Windows versions prior to 8.1, that value isn&#8217;t recognized. Thus, Windows Vista, Windows 7, and Windows 8 will consider the application as a DPI-unaware application and the DWM will scale it. Unless you only target Windows 8.1, you won&#8217;t want this to happen.</p>
<p>&nbsp;</p>
<p>You can solve this problem creating an XML manifest file with a special value for <code>dpiAware</code>:<code>True/PM</code>. This value sets the application to per-monitor DPI-aware on Windows 8.1, but sets the application to system DPI-aware on Windows Vista through Windows 8. This way, your application will behave as a system DPI-aware one on Windows versions lower than 8.1. The following lines show the XML code for the manifest you have to create:</p>
<p>&nbsp;</p><pre class="crayon-plain-tag">&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&amp;gt;
&amp;lt;assembly xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot;
  manifestVersion=&quot;1.0&quot;&amp;gt;
  &amp;lt;application xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;&amp;gt;
    &amp;lt;windowsSettings&amp;gt;
      &amp;lt;dpiAware xmlns=&quot;http://schemas.microsoft.com/SMI/2005/WindowsSettings&quot;&amp;gt;True/PM&amp;lt;/dpiAware&amp;gt;
    &amp;lt;/windowsSettings&amp;gt;
  &amp;lt;/application&amp;gt;
&amp;lt;/assembly&amp;gt;</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<p>You need to save the XML manifest and tell Visual Studio to merge it. Right-click on the project name (<code>DPIAware</code>) within Solution Explorer and select Properties. Visual Studio will show the Property Pages dialog box for the project. Then, select Configuration Properties | Manifest Tool | Input and Output | DPI Awareness, and select None. You don&#8217;t want Visual Studio to specify and DPI awareness configuration in the manifest because you provide it with the manifest file. Then, specify the full path for the XML manifest file you saved in Additional Manifest Files and click OK. Now, the application will work as a per-monitor DPI aware application in Windows 8.1, and as a system DPI aware application in previous Windows versions.</p>
<p>As you can see from this simple example, if you code a scale helper class, it is pretty easy for you to convert a system DPI-aware application into a per-monitor DPI aware one. You can use either the retrieved DPI value or the calculated scale factor to load the necessary resources that have been prepared for the different scale factors you want to support. End users will definitely welcome your investment in providing crisp and clear text and images for their different high-DPI displays.</p>
<hr style="color: #cccccc;" />
<p><i><a style="color: #003bb0;" href="https://plus.google.com/u/0/101673430245650260849/">Gastón Hillar</a> is a senior contributing editor at </i>Dr. Dobb&#8217;s.</p>
<h3>Related Article</h3>
<p><a style="color: #003bb0;" href="http://www.drdobbs.com/windows/programming-for-high-res-displays-in-win/240168626">Programming for High-Res Displays in Windows</a></p>
</article>
</div>
<p>http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736?pgno=3</p>
</article>
</div>
]]></content:encoded>
			<wfw:commentRss>https://www.softwareace.cn/?feed=rss2&#038;p=1179</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>获取本机内容DPI缩放比例</title>
		<link>https://www.softwareace.cn/?p=747</link>
		<comments>https://www.softwareace.cn/?p=747#comments</comments>
		<pubDate>Thu, 27 Mar 2014 06:45:34 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[取词]]></category>
		<category><![CDATA[DPI]]></category>

		<guid isPermaLink="false">http://www.softwareace.cn/?p=747</guid>
		<description><![CDATA[[crayon-69e76abcb9ca4042818808/] &#160;]]></description>
				<content:encoded><![CDATA[<p></p><pre class="crayon-plain-tag">#define WINVER 0x0600
#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;WinUser.h&gt;
int main()
{
	{
		SetProcessDPIAware();
		HDC hdcScreen = GetDC(NULL);   //获取屏幕的HDC   
		double nScreenWidth = GetDeviceCaps(hdcScreen, LOGPIXELSX);  
		double bb = nScreenWidth/96;
		std::cout &lt;&lt;" DPI倍数"&lt;&lt; bb&lt;&lt; std::endl;
	}
}</pre><p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.softwareace.cn/?feed=rss2&#038;p=747</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
