<?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>HiDPi &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/hidpi/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Tue, 02 Mar 2021 18:06:22 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Avoiding Common Programming Pitfalls</title>
		<link>https://blog.xojo.com/2019/02/25/programming-pitfalls/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Mon, 25 Feb 2019 10:00:01 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[Encoding]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5431</guid>

					<description><![CDATA[Check that you aren't falling for some of the most common programming pitfalls]]></description>
										<content:encoded><![CDATA[<p>Code doesn&#8217;t care whether you are new to programming or an old pro, a citizen developer or the head of engineering, some missteps can catch any of us. Read on to learn some of the most common programming pitfalls and how to avoid them.</p>
<p><span id="more-5431"></span></p>
<h2>Ignoring Encoding</h2>
<p>When working with Strings that come from (or are sent) outside your app, you always need to consider the encoding of the text. These days, UTF8 is the most common encoding for text and probably the one you should use most of the time. But if you&#8217;re getting text from a database or a web service or just another file that you don&#8217;t control, then you&#8217;ll want to use the <a href="https://documentation.xojo.com/api/text/encoding_text/defineencoding.html">DefineEncoding</a> method to set the correct encoding of the incoming text or use <a href="https://documentation.xojo.com/api/text/encoding_text/convertencoding.html">ConvertEncoding</a> to cover the encoding to something you&#8217;d rather be using, such as UTF8.</p>
<p>Kem Tekinay is doing a session on called <a href="https://www.xojo.com/xdc/sessions/info/tekinay/">Decoding Text Encodings</a> at <a href="https://www.xojo.com/xdc">XDC 2019</a> that you won&#8217;t want to miss.</p>
<p><img fetchpriority="high" decoding="async" class="size-medium aligncenter" src="https://upload.wikimedia.org/wikipedia/en/5/54/A2600_Pitfall.png" width="320" height="226" /></p>
<h2>Avoiding Exception Handling</h2>
<p>Some classes <a href="https://documentation.xojo.com/getting_started/debugging/exception_handling.html">raise exceptions</a> when something unexpected happens. If your code ignores these exceptions then this causes your app to display an error message to the user which forces them to quit the app. That&#8217;s not the best experience.</p>
<p>At the very least you should have some code in the App.UnhandledException event for your desktop/web/iOS app so that you will know when these occur. The code do something as simple as log the error to the system log or a file so that you&#8217;ll have it to investigate.</p>
<p>Then you can pinpoint the part of the code where it occurred and add the appropriate <a href="https://documentation.xojo.com/api/code_execution/try.html">Try&#8230;Catch</a> code to deal with it appropriately and gracefully.</p>
<p>As an example, if you call XMLDocument.LoadXML and supply invalid XML, then an XMLException is raised. By catching this exception you can display a message to the user telling them the XML file they selected is invalid and asking them to choose another.</p>
<h2>Skipping Database Error Checking</h2>
<p>Whenever you run a database command it is possible that there was a database error that happened. But you won&#8217;t know about it unless you check the if <a href="https://documentation.xojo.com/api/deprecated/deprecated_class_members/database.error.html">Database.Error</a> is True. Always do this and then display or log the <a href="https://documentation.xojo.com/api/deprecated/deprecated_class_members/database.error.htmlCode">Database.ErrorCode</a> and <a href="https://documentation.xojo.com/api/deprecated/deprecated_class_members/database.error.htmlMessage">Database.ErrorMessage</a>.</p>
<p>This can really help with catching subtle problems, such as a typo in a SELECT statement.</p>
<h2>Ignoring Memory Leaks</h2>
<p>A memory leak in your app is when it keeps reserving memory but never gives it back. Oftentimes this is not noticeable as the increased memory usage is minimal and does not typically affect 64-bit apps. In addition the memory is released when your app quits. But if you have a significant memory leak you should look into figuring out how to eliminate it.</p>
<p>You can determine if your app has a memory leak by checking (using the OS Task Manager or Activity Monitor) if its memory usage increases significantly as the app is used even while you are closing windows or documents that are no longer used.</p>
<p>It is possible you have some objects that are never going Nil and thus not releasing their memory. Normally you don&#8217;t have to worry about setting objects to Nil manually as Xojo uses automatic reference counting (ARC) to clean up memory. But there is a situation, called a <a href="https://documentation.xojo.com/topics/debugging/how_xojo_manages_memory.html">circular reference</a>, that can lead to objects not being set to Nil.</p>
<p>A circular reference means that ObjectA refers to ObjectB and ObjectB refers to ObjectA. Since neither ever has its reference count get to zero, then they cannot be released from memory.</p>
<p>You can either manually set things to Nil to ensure that memory is released or you can make use of the <a href="https://documentation.xojo.com/api/language/weakref.html">WeakRef</a> class to help manage it.</p>
<h2>Fuzzy Graphics in HiDPI</h2>
<p>If you used pictures in older projects then they&#8217;ll only have a single size. When you enabled HiDPI for your project (Shared Build Settings -&gt; Supports HiDPI) then this picture is treated as a 1x size and is scaled in HiDPI screens. This can result in a fuzzy or blurry picture.</p>
<p>Instead you want to start using <a href="https://documentation.xojo.com/getting_started/using_the_ide/image_set_editor.html">Image Sets</a>. When you create an Image Set you have three &#8220;slots&#8221; for 1x, 2x and 3x image sizes. Supplying at least 1x and 2x images will limit unnecessary scaling and cause your images to appear much sharper and clearer. Image Sets are created by default in current versions of Xojo when you add a picture or image to your project. Right click on existing pictures in the project and choose &#8220;Convert to Image&#8221; to convert them to an image so you can add additional sizes.</p>
<h2>Not Updating to 64-bit</h2>
<p>For macOS, you should definitely be updating your projects so they build 64-bit apps. It&#8217;s likely that the version of macOS that is released later this year will no longer support 32-bit apps at all and you&#8217;ll want to be prepared. For many projects you just have to change the Build Architecture setting for the OS from &#8220;x86 32-bit&#8221; to &#8220;x86 64-bit&#8221;. Some projects may require updates to Declares that call OS libraries to ensure they can call the 64-bit version of the library.</p>
<p>It&#8217;s less of a rush on Windows as 64-bit versions of Windows still fully support 32-bit apps. However, on a 64-bit version of Windows, which are becoming increasingly common, you will get better overall performance as the OS does not have to load 32-bit compatibility layers which use up memory and CPU.</p>
<p>On Linux, 64-bit distributions are becoming more and more common and many do not include any built-in support for 32-bit apps. So you&#8217;ll want to be able to distribute a 64-bit app if at all possible.</p>
<h2>Not Checking the Docs</h2>
<p>We are working to consolidate all the documentation into one place and that place is: https://documentation.xojo.com</p>
<p>As part of this process, the docs have been cleaned up, updated and we&#8217;ve improved the categorization to make it easier to find things. This is an ongoing process, of course. But sometimes it will be faster to look up something in the docs than it is to post a question in the <a href="http://forum.xojo.com">forum</a> and wait for replies.</p>
<p>I hope you find some of these tips helpful. At <a href="https://www.xojo.com/xdc/sessions/info/lefebvre/">XDC 2019</a>, I&#8217;ll be covering additional tips in my two sessions: <em>Avoid Troubleshooting Troubles: Effective Debugging Techniques</em> and <em>Virtuous Code Optimization</em>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IDE changes in Xojo 2018r3 and more</title>
		<link>https://blog.xojo.com/2018/10/23/following-the-dark-path/</link>
		
		<dc:creator><![CDATA[Greg O'Lone]]></dc:creator>
		<pubDate>Tue, 23 Oct 2018 10:00:43 +0000</pubDate>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[DarkMode]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Lingua]]></category>
		<category><![CDATA[macOS]]></category>
		<category><![CDATA[Remote Debugging]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Xojo Feedback]]></category>
		<category><![CDATA[Xojo IDE]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5075</guid>

					<description><![CDATA[About three years ago, we added HiDPI/Retina support to our framework which was released to users as part of Xojo 2016r1 when we also shipped&#8230;]]></description>
										<content:encoded><![CDATA[<p>About three years ago, we added HiDPI/Retina support to our framework which was released to users as part of Xojo 2016r1 when we also shipped our first HiDPI IDE.</p>
<p>With Apple’s announcements at WWDC 2018 and the introduction of dark mode it was time to revisit our graphics and the overall appearance of the IDE again. Here are some things which contribute to the changes that have been made and ones that you will see in the coming months.</p>
<p><span id="more-5075"></span></p>
<h3><b>Dropping macOS 10.9</b></h3>
<p>Xojo 2018r3 drops support for macOS 10.9 and as the last version which had the skeuomorphic design elements all of our supported OS’s now have the flatter modern design. It’s not that this has held anything up per se, but it’s a good reminder that “it’s time”.<span class="Apple-converted-space"> </span></p>
<p>To that end, we have taken that opportunity to remove some of the graphics that make the IDE look out of place and doing so subtly lowers the memory footprint and accelerates drawing of the IDE itself across all platforms. We&#8217;re also using a variation of Apple&#8217;s image templates which has somewhat reduced the on-disk footprint of the IDE itself.</p>
<h3><b>macOS Dark Mode</b></h3>
<p>Apple’s addition of a darker variant of the visual “Aqua” theme in macOS means that we needed to do an audit and update of several of our base framework controls so that <i>your</i> apps would render correctly as well as ours.<span class="Apple-converted-space"> </span></p>
<h4>Events</h4>
<p>While it probably won’t be used very often (how often does one change themes while running a piece of software, besides the novelty of seeing it happen), we added an event to the App class named AppearanceChanged to notify you when the user changes from light to dark or changes their accent color. This is a good place to clear any graphic or color caches which contain theme specific UI graphics.<span class="Apple-converted-space"> </span></p>
<h4>Methods</h4>
<p>There is also a new global method called IsDarkMode(Boolean) which will return True if your app is running with the Dark Mode theme on macOS 10.14 or higher.<span class="Apple-converted-space"> If your app is running on 10.13 or lower or in light mode on 10.14, IsDarkMode will return False.</span></p>
<h4>Build Settings</h4>
<p>Enabling Dark Mode in your apps is as easy as flipping a switch in the Shared Build Settings. Unfortunately, because Apple made the assumption that most apps would “just work” versions of your apps compiled with older versions of Xojo will either need to be recompiled with Xojo 2018r3 or you’ll need to push out a new version with a plist entry to prevent macOS 10.14 from showing your app dark in Dark Mode.<span class="Apple-converted-space"> </span></p>
<h4>Testing</h4>
<p>When testing apps for use with Mojave&#8217;s dark mode, I seriously suggest that you test on a system that allows you to see the translucency effects of dark mode. Virtual Machines are usually really handy for testing, but in this case, Parallels Desktop 14, VirtualBox 5.2 and VMWare Fusion 11 do not show the subtleties of dark mode.</p>
<h4>Colors</h4>
<p>One of our goals at Xojo is to remove some of the headaches involved with the minutiae of each OS that you deploy for and to that end, we wanted to make drawing custom controls easier too. What this means is that the built-in global colors are largely theme aware now and will change depending on whether your app is running in light or dark mode on macOS. This affects things like TextColor, FillColor, FrameColor, HighlightColor, etc, so if you use those methods when drawing in pictures and canvases, you will want to audit that code. If you want a specific color, you should use a color constant. For instance, use &amp;c000000 if you want black because TextColor will now return white in Dark Mode.<span class="Apple-converted-space"> </span></p>
<p>In terms of the framework controls themselves, we are taking this opportunity to make some changes to make your apps appear better in the macOS 10.10+ ecosystem. Ever notice that a Label control and the text portion of a CheckBox or RadioButton control are not exactly the same color? Going forward, the default colors of controls which <i>should</i> automatically change between Light and Dark modes <i>will</i> do that. So if you have a Label using the default color of &amp;c00000000 (Black with Transparency = 0), the color that is actually used is what Apple calls labelColor. It’s still black, but is a tiny bit translucent. TextFields and TextAreas will automatically change text, placeholder, selection and background colors to match the Apple prescribed colors for automatic Light/Dark compatibly. We think you’ll find that building your apps with 2018r3 will largely make them just behave and appear the way you expected them to.</p>
<p>IMPORTANT NOTE: These color and framework changes affect how your apps draw on <i>all</i> versions of macOS, so make sure you try them out on your 10.10 through 10.14 VMs before shipping!</p>
<h4>Eating our own dog food</h4>
<p>One thing we hear from users every so often is the desire for Xojo to use our own products for building apps. As most of you know the IDE itself is written in Xojo, but we also have several other apps (big and small) that are written in Xojo.</p>
<ul>
<li>Feedback &#8211; Our bug reporting system</li>
<li>Xorders &#8211; Our internal order system</li>
<li>Lingua &#8211; The Xojo localization app</li>
<li>Remote Debugger &#8211; The remote debugger stubs for desktop and console</li>
</ul>
<p>While the 2018r3 cycle was in progress, all four of these projects got updated for Mojave&#8217;s Dark Mode and definitely helped us find framework rendering bugs early on in the pre-release process.</p>
<h4><b>What about Windows and Linux?</b></h4>
<p>The TL;DR version is that we’re still looking into it.<span class="Apple-converted-space"> </span></p>
<p>Currently there are several different ways to change Windows 7, 8 and 10 to use a dark interface, not all of which are compatible with the Xojo Framework controls and the Windows 10 2018 Fall Update promised yet another way but that ended up only being for UWP. We are looking into which method gets you the most “bang for the buck” so to speak.<span class="Apple-converted-space"> </span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Community Growth in 2016</title>
		<link>https://blog.xojo.com/2017/01/05/xojo-community-growth-in-2016/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 05 Jan 2017 17:33:50 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[XDC]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Retina]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2137</guid>

					<description><![CDATA[As you may already know, 2016 was Xojo's 20 Anniversary. I take great pride in the fact that we have created something that has that kind of staying power. In 2016 we took many big steps forward with Xojo including HiDPI support for macOS (Retina), Windows and the web, hardware-acellerated graphics for Windows, tons of new iOS features, IDE improvements and compiler optimization for 64-bit builds. From everyone here at Xojo, Happy New Year!]]></description>
										<content:encoded><![CDATA[<p>As you may already know, 2016 was Xojo&#8217;s 20 Anniversary. Sitting down to write this post, I can&#8217;t help but think back to 20 years ago and starting what has now become Xojo. Most of the developer tools that were around when we started either no longer exist or are no longer published by the people who had the original vision to create them in the first place. In that respect, we are members of a very exclusive club. I&#8217;m also pleasantly surprised at how many users from way back then are actively using Xojo today. I take great pride in the fact that we have created something that has that kind of staying power.</p>
<p><span id="more-2137"></span></p>
<figure id="attachment_2138" aria-describedby="caption-attachment-2138" style="width: 1010px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-2138 size-full" src="https://blog.xojo.com/wp-content/uploads/2016/12/Anniversary-Shirt.png" alt="anniversary-shirt" width="1010" height="732" /><figcaption id="caption-attachment-2138" class="wp-caption-text">Email hello@xojo.com to order yours!</figcaption></figure>
<p>In 2016 we took many big steps forward with Xojo including HiDPI support for macOS (Retina), Windows and the web, hardware-acellerated graphics for Windows, tons of new iOS features, IDE improvements and compiler optimization for 64-bit builds. Check out the <a href="http://developer.xojo.com/2016-release-highlights">2016 Release Highlights</a>. The Xojo Forum has grown to over 16,000 members. We published our 100th video in the <a href="https://www.youtube.com/c/xojoinc">Xojo YouTube Channel</a> and added new playlists for <a href="https://www.youtube.com/playlist?list=PLPoq910Q9jXi_p96LT5k4BPwBlmH1HytK">Raspberry Pi</a> and <a href="https://www.youtube.com/playlist?list=PLPoq910Q9jXiH5A32myqHwd1WLuUnBTuO">Web Services</a> and more new videos in our <a href="https://www.youtube.com/playlist?list=PLPoq910Q9jXiePe2EYqV1J4whLP9O9vHQ">Spanish</a>, <a href="https://www.youtube.com/playlist?list=PLPoq910Q9jXjoTYaHQeFRKpk1p7qKbwCd">Italian</a> and <a href="https://www.youtube.com/playlist?list=PLPoq910Q9jXiYHemQHGYv3CO7vQWYt7Gz">German</a> language playlists.</p>
<p>We hosted another highly successful<a href="http://blog.xojo.com/2016/10/11/xdc-2016-recap/"> Xojo Developer Conference</a> in Houston, Texas and we&#8217;ll have an announcement soon about the next XDC. 2016 was another great year for Xojo and 2017 is looking even better! One of my favorite things is hearing about all the cool projects our users create and I have no doubt that there will be many more this year.</p>
<p>From everyone here at Xojo, Happy New Year!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Web Framework Changes in 2016r2</title>
		<link>https://blog.xojo.com/2016/07/20/web-framework-changes-in-2016r2/</link>
		
		<dc:creator><![CDATA[Greg O'Lone]]></dc:creator>
		<pubDate>Wed, 20 Jul 2016 07:03:46 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[Retina]]></category>
		<category><![CDATA[Xojo Framework]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1085</guid>

					<description><![CDATA[The web framework got some love in Xojo 2016r2&#8230; General Changes First, the Web Framework now has support for Retina/HiDPI in supported browsers. All controls&#8230;]]></description>
										<content:encoded><![CDATA[<p>The web framework got some love in Xojo 2016r2&#8230;</p>
<h2>General Changes</h2>
<p>First, the Web Framework now has support for Retina/HiDPI in supported browsers. All controls have been updated with new graphics to allow your Web Apps to look great on any screen. All you have to do is just flip the &#8220;Supports Retina/HiDPI&#8221; switch and start using Image objects instead of Pictures and you&#8217;re off and running!</p>
<p><em>NOTE: Regardless of whether you check the &#8220;Supports Retina/HiDPI&#8221; switch, the web framework now stores all of your image assets in the Resources directory next to your app and they are only loaded momentarily when a browser requests one. This means that your app should use a lot less memory overall.</em></p>
<p><strong>Controls</strong></p>
<p>WebCanvas: HiDPI/Retina drawing out of the box! No code change required!</p>
<p>WebPicture: Just start using Images instead of Pictures and flip the Retina/HiDPI switch and the web framework will automatically send the correct resolution image to the browser.</p>
<p>WebImageView: Because it&#8217;s backed with a WebPicture, it just works!</p>
<p>WebToolbar: Toolbar icons now support Images as well.</p>
<p><strong>Events</strong></p>
<p>WebSession.ScaleFactorChanged: Fires whenever the ScaleFactor of the current session&#8217;s browser changes.</p>
<p><strong>Properties</strong></p>
<p>WebSession.ScaleFactor (Read-Only): Reflects the current ScaleFactor of the browser.</p>
<h2>WebSDK</h2>
<p>The WebSDK has been given a ScaleFactorChanged event so your control is notified when a change occurs instead of your control needing to periodically check the ScaleFactor property on the Session object.</p>
<p>WebControlWrapper.ScaleFactorChanged: Fires whenever the ScaleFactor of the current session&#8217;s browser changes.</p>
<p>Also for WebSDK, we are now enforcing unique Javascript Namespaces throughout a project at compile time. This means you&#8217;ll be able to tell ahead of time if your controls are missing a namespace or if you&#8217;ve inadvertently used the same exact namespace more than once!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Advanced Retina/HiDPI: BitmapForCaching and ScaleFactorChanged</title>
		<link>https://blog.xojo.com/2016/04/07/advanced-retinahidpi-bitmapforcaching-and-scalefactorchanged/</link>
					<comments>https://blog.xojo.com/2016/04/07/advanced-retinahidpi-bitmapforcaching-and-scalefactorchanged/#comments</comments>
		
		<dc:creator><![CDATA[Joe Ranieri]]></dc:creator>
		<pubDate>Thu, 07 Apr 2016 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[Retina]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2016/04/07/advanced-retinahidpi-bitmapforcaching-and-scalefactorchanged/</guid>

					<description><![CDATA[The most direct way to support HiDPI for custom controls is to draw into the Graphics object passed into the Paint event. But you can also BitmapForCaching and ScaleFactorChanged]]></description>
										<content:encoded><![CDATA[<p>The most direct way to support HiDPI* for custom controls is to draw into the Graphics object passed into the Paint event. That graphics object is already configured with the appropriate scale factor and double buffering- the entire control will be handled correctly by the framework if the DoubleBuffer property is set.</p>
<p><em>*As with other posts, we&#8217;ll use &#8220;HiDPI&#8221; to refer to both HiDPI on Windows and Retina on OS X.</em></p>
<p><span id="more-232"></span></p>
<p>If drawing directly into the Graphics object passed into the control&#8217;s Paint event isn&#8217;t feasible or you need to manage your own caching of costly drawing for some reason, the BitmapForCaching function can be used to create a mutable bitmap thatâs configured appropriately for using as a cache. This bitmap has some screen-specific properties, like the scale factor, and should be thrown away in the ScaleFactorChanged event. For example:</p>
<pre>Class Foo<br />
 Inherits Canvas</p>
<p> Sub Paint(g As Graphics) Handles Event<br />
  CreateCacheIfNeeded()<br />
  g.DrawPicture(mCachedContent, 0, 0)<br />
 End Sub</p>
<p> Sub ScaleFactorChanged() Handles Event<br />
  mCachedContent = Nil<br />
 End Sub</p>
<p> Private Sub CreateCacheIfNeeded()<br />
  If mCachedContent &lt;&gt; Nil Then Exit Sub</p>
<p>  // Pretend this is a costly operation<br />
  mCachedContent = Self.TrueWindow.BitmapForCaching(100, 100)<br />
  Dim g As Graphics = mCachedContent.Graphics<br />
  g.FillRect(0, 0, g.Width, g.Height)<br />
 End Sub</p>
<p> Private Dim mCachedContent As Picture<br />
End Class</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.xojo.com/2016/04/07/advanced-retinahidpi-bitmapforcaching-and-scalefactorchanged/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Xojo Retina/HiDPI: The journey of a thousand pixels&#8230;</title>
		<link>https://blog.xojo.com/2016/04/05/xojo-retinahidpi-the-journey-of-a-thousand-pixels/</link>
					<comments>https://blog.xojo.com/2016/04/05/xojo-retinahidpi-the-journey-of-a-thousand-pixels/#comments</comments>
		
		<dc:creator><![CDATA[Greg O'Lone]]></dc:creator>
		<pubDate>Tue, 05 Apr 2016 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[Retina]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2016/04/05/xojo-retinahidpi-the-journey-of-a-thousand-pixels/</guid>

					<description><![CDATA[Tips, Tricks and Code to help you build your first Retina / HiDPI apps with Xojo 2016r1.]]></description>
										<content:encoded><![CDATA[<p>&#8220;Retina&#8221; is the name for high resolution screens on Mac and iOS devices while &#8220;HiDPI&#8221; is the Windows equivalent. For simplicity, I&#8217;ll use HiDPI (which really is the universal technical term) for the rest of this blog post. Now that we have HiDPI support in Xojo, if you app doesn&#8217;t use any pictures, you can simply open your project, click on Shared under Build Settings and turn on the &#8220;Supports Retina/HiDPI&#8221; option. That&#8217;s all you need to do to have a HiDPI version of your app!</p>
<p>Having said that, if you are creating or using pictures in your project, there may be a few adjustments you&#8217;ll need to make to your code. A little over a year ago the process of making sure we had all of the necessary graphics together to build a Retina/HiDPI IDE was added to my to-do list. While 95% of the icons created for the Xojo IDE in 2013 already existed, most of the graphics that made up the IDE itself did not, and the IDE itself needed a bit of an overhaul to get it ready for the big change, both in graphics and in code&#8230;</p>
<p><span id="more-230"></span><span style="font-size: 18px;"><strong>Graphics</strong></span></p>
<p>Since the Xojo framework didn&#8217;t have any HiDPI support yet, everything done last year was done brute force, that is, 2x images were loaded, scaled down by 50% and drawn where they belonged, just to make sure things would mostly line up correctly. While doing this did reveal the amount of work that we were in for, it also hid some issues that we ran into when the HiDPI-enabled frameworks started coming available this spring.</p>
<p>To give you an idea of the size of the task, there are a little over 1000 distinct icons and images used in the IDE today, of which ~370 we did not have a HiDPI version. Now while I like using programs like PhotoshopÂ® or FireworksÂ® for doing work like this, I wanted to transition our graphics to a vector drawing tool so that if/when a higher resolution screen is available, we&#8217;ll be able to go back to the originals and start from resolution-independent source-material. That said, we settled on using Bohemian Coding&#8217;s <a href="http://www.sketchapp.com" target="_blank" rel="nofollow">Sketch</a> for the majority of the new graphics work. Total time to generate the missing images was about two man-months.</p>
<p><span style="font-size: 18px;"><strong>Code</strong></span></p>
<p>Once the HiDPI-enabled frameworks started coming together, every place where a picture was being drawn needed to be audited (see why in the next section). This work took us from mid-December all the way through mid-March. I won&#8217;t tell you that it took two of us three full months of 60 hour weeks to accomplish, <em>but it sure felt like it</em>.</p>
<p>A couple of legacy coding issues came to light which would have to be resolved for everything to work right and I wanted to go over them just in case your projects don&#8217;t render correctly right off the bat. Let&#8217;s look at what&#8217;s changed.</p>
<p><strong>Points vs. Pixels</strong></p>
<p>This is by far the most common issue you&#8217;ll probably run into. Before Xojo had HiDPI support, a single element of color on a Picture and a single element of color on a Graphics object were exactly the same thing, pixel for pixel.. If your code looked like this:</p>
<pre style="background-color: #ffffcc; padding: 10px;">Dim p As New Picture(100, 100)
Dim g as Graphics = p.Graphics
Dim widthPic as Integer = p.Width
Dim widthGraphics as Integer = g.Width</pre>
<p>both widthPic and widthGraphics would have values of 100.</p>
<p>Now with HiDPI turned on, Picture coordinates and Graphics coordinates <em>can be</em> different from one another if the scale factor of the screen is greater than one. If you were to change the code above to:</p>
<div style="background-color: #ffffcc; padding: 10px;">
<pre>Dim p As TrueWindow.BitmapForCaching(100, 100)
Dim g as Graphics = p.Graphics
Dim widthPic as Integer = p.Width
Dim widthGraphics as Integer = g.Width</pre>
<p><em><span style="font-size: 12px;">Note: The BitmapForCaching method creates an image that has the right number of pixels and the right scale factor so you can just draw to it the way you always have and have everything still work exactly the same.</span></em></p>
</div>
<p>The value of widthPic will differ depending on whether your application is running on a HiDPI screen or not:</p>
<table style="height: 80px; border: 1px solid black; margin-left: auto; margin-right: auto;" border="0" width="395">
<tbody>
<tr>
<td></td>
<td style="text-align: center;">widthPic</td>
<td style="text-align: center;">widthGraphics</td>
</tr>
<tr>
<td style="text-align: right;">Normal</td>
<td style="text-align: center;">100</td>
<td style="text-align: center;">100</td>
</tr>
<tr>
<td style="text-align: right;">HiDPI</td>
<td style="text-align: center;"><strong>200</strong></td>
<td style="text-align: center;">100</td>
</tr>
</tbody>
</table>
<p>&#8230;and this is where the trouble begins because the number of physical pixels has actually doubled (in both directions, by the way) while the width and height of the Graphics object still reflect the original dimensions. The difference between these values is the scale factor of the screen you are drawing to.</p>
<p>Now, if you consider that Picture.Width and Graphics.Width have been interchangeable until now, you can see that this can cause a bit of a problem. When drawing to the Graphics object, you need to be working in Graphics pixels, not Picture pixels:</p>
<pre style="background-color: #ffffcc; padding: 10px;">Dim p As TrueWindow.BitmapForCaching(100, 100)
Dim g as Graphics = p.Graphics
Dim widthPic as Integer = p.Width
Dim widthGraphics as Integer = g.Width
g.ForeColor = &amp;cFF0000
g.DrawOval(0, 0, g.Width, g.Height) // Correct
g.DrawOval(0, 0, p.Width, p.Height) // This will draw too large</pre>
<p>To wrap up this already long story, make sure all of your drawing routines are using coordinates relative to the Graphics object.</p>
<div style="background-color: #eee; padding: 10px;">If right about now you&#8217;re wondering what we were smoking when this decision was made, rest assured that it was discussed for a long time and the overwhelming driving force was to maintain backward compatibility. With things set up this way you can still draw it onto a Graphics object created with the HiDPI framework and it should just work!</div>
<p><strong>Immutable Pictures</strong></p>
<p>Another hurdle you&#8217;ll undoubtedly encounter is the fact that multiresolution images are not inherently editable. This allows the framework to be more intelligent about loading and unloading images at runtime. This affects Image objects created in the IDE as well as ones created in code using the new Picture Constructor API. The most obvious effect is that you can&#8217;t draw directly to these images any more and the Graphics and RGBSurface properties will be Nil. If you need the ability to draw onto a picture via its Graphics property, draw the image onto a Picture created in code and work from that &#8211; don&#8217;t forget to copy the scale properties!</p>
<p><strong>Nested Drawing</strong></p>
<p>If your application creates pictures, and draws other pictures and clips into it using several levels of nesting, make sure you start from the top level when refactoring your code. You&#8217;ll find any compounded scaling errors much earlier this way, but you&#8217;ll also run a much smaller risk of creating issues that will only manifest when you go back and fix the top level drawing routines.</p>
<p><strong>Drawing Without Context</strong></p>
<p>For most of you, your drawing code will be directly in the Paint event of a Canvas and the Graphics object passed to the event already has all of the information that you need to succeed. In addition, you can always get a mutable picture that is all set up for the current screen by calling the new Window.BitmapForCaching method. This method is available from any RectControl, Window or ContainerControl subclass using TrueWindow.BitmapForCaching.</p>
<p>If (for some reason) you don&#8217;t have access to a window from your code, you <em>can</em> create a HiDPI image from a Graphics context by using the new ScaleX and ScaleY properties to set things up. For consistency, we created an extends method in a module like this:</p>
<pre style="background-color: #ffffcc; padding: 10px;">Function BitmapForCaching(Extends g as Graphics, Width as Integer,  Height as Integer) As Picture
  Dim p as New Picture(Width * g.ScaleX, Height * g.ScaleY)
  // Set the appropriate resolution
  p.HorizontalResolution = 72 * g.ScaleX
  p.VerticalResolution = 72 * g.ScaleY

  // Set the scale factor so drawing to it will be correct
  p.Graphics.ScaleX = g.ScaleX
  p.Graphics.ScaleY = g.ScaleY

  // Very important to remember the mask!
  p.Mask.Graphics.ScaleX = g.ScaleX
  p.Mask.Graphics.ScaleY = g.ScaleY

  // Return the new picture
  Return p
End Function</pre>
<p>If neither a Window nor a Graphics context is available, you can always create a multi-representation picture and leave it up to the framework to choose the right one when the image is being drawn to a Window, like this:</p>
<pre style="background-color: #ffffcc; padding: 10px;">Dim pa() as Picture
Dim p1 as new Picture(100, 100)
p1.Graphics.DrawOval(0, 0, 100, 100)
pa.append p1

Dim p2 as New Picture(200, 200)
p2.Graphics.DrawOval(0, 0, 200, 200)
pa.append p2

Dim RetinaPicture as New Picture(100, 100, pa)</pre>
<p>You&#8217;ll have to draw everything twice, so I suggest caching these images so you don&#8217;t need to do this more than once, especially if your drawing code is complicated. You can use a similar technique to load images from disk:</p>
<pre style="background-color: #ffffcc; padding: 10px;">Dim pa() as Picture
Dim f as Folderitem = GetFolderItem("Test.png")
Dim pic as Picture = Picture.Open(f)
pa.append pic

f = GetFolderItem("Test@2x.png")
pic = Picture.Open(f)
pa.append pic

Dim RetinaPicture as New Picture(100, 100, pa)</pre>
<p>Just remember that the images passed into this form of the Picture.Constructor must all have exactly the same aspect ratio or the framework will throw an InvalidArgumentException!</p>
<p><span style="font-size: 18px;"><strong>Conclusion</strong></span></p>
<p>We&#8217;re looking forward to seeing all of your apps become HiDPI-aware and hearing about your experiences. I hope that our experience and suggestions make your transition just a little bit easier!<span id="hs-cta-wrapper-aeb03183-a469-4f96-9547-7dd75111c681" class="hs-cta-wrapper"><span id="hs-cta-aeb03183-a469-4f96-9547-7dd75111c681" class="hs-cta-node hs-cta-aeb03183-a469-4f96-9547-7dd75111c681"><a href="http://cta-redirect.hubspot.com/cta/redirect/608515/aeb03183-a469-4f96-9547-7dd75111c681" target="_blank"><br />
</a> </span><script src="https://js.hscta.net/cta/current.js" charset="utf-8">// <![CDATA[
<script type="text/javascript"><![CDATA[ hbspt.cta.load(608515, 'aeb03183-a469-4f96-9547-7dd75111c681', {}); // ]]&gt;</script></span></p>
<p>Read more: <a href="http://blog.xojo.com/2016/04/07/advanced-retinahidpi-bitmapforcaching-and-scalefactorchanged/">Advanced Retina/HiDPI: BitmapForCatching and ScaleFactorChanged</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.xojo.com/2016/04/05/xojo-retinahidpi-the-journey-of-a-thousand-pixels/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>O Retina, Retina, wherefore art thou Retina?</title>
		<link>https://blog.xojo.com/2015/12/08/o-retina-retina-wherefore-art-thou-retina/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 08 Dec 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[HiDPi]]></category>
		<category><![CDATA[Retina]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/12/08/o-retina-retina-wherefore-art-thou-retina/</guid>

					<description><![CDATA[Xoj is a cross-platform tool so we decided we should support both Retina and HiDPI, and do it in such a way that you don't have to do much of anything and they just work.]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" style="margin: 0px 10px 10px 0px; float: left; width: 320px;" title="eyeball.png" src="https://blog.xojo.com/wp-content/uploads/2015/12/eyeball.pngt1466486449161ampwidth320" sizes="(max-width: 320px) 100vw, 320px" alt="eyeball.png" width="320" data-constrained="true" />During my keynote address last April at XDC, the Xojo Developer Conference, I said that we would be adding Retina support (the OS X feature that provides for ultra-high resolution displays) to the OS X framework in the 4th quarter of this year. We have been working very hard on Retina support both for the OS X framework and for the IDE itself. We didn&#8217;t want to stop there though. Windows also supports ultra-high resolution displays. For Windows, this technology is called HiDPI. Xojo is a cross-platform tool so we decided we should support both Retina and HiDPI, and do it in such a way that you don&#8217;t have to do much of anything and they just work.</p>
<p><a href="http://blog.xojo.com/2016/04/05/xojo-retinahidpi-the-journey-of-a-thousand-pixels/">UPDATE: Xojo Retina is here, April 2016</a></p>
<p><span id="more-306"></span></p>
<p>This bigger feature set of course takes a bit longer. We were hoping to ship it in 2015r4 this month but that&#8217;s not going to happen. There&#8217;s simply not enough time to test Retina/HiDPI support well enough to satisfy us. Instead, this feature along with a Retina/HiDPI-enabled Xojo IDE will come in 2016r1.</p>
<p>There will still be a 2015r4 release. We&#8217;ve been squashing bugs as we always do and we&#8217;ll get Xojo 2015r4 into your hands this month so you can have an even more robust base upon which to build your apps.</p>
<p>No one likes waiting, but the year is almost over and 2016r1 will be here before you can say Remote Debugger! OK, maybe not quite that fast but soon enough. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>From all of us at Xojo, Inc. we thank you for your continued support and we wish you and yours Happy Holidays.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Writing High-DPI Aware Windows Apps</title>
		<link>https://blog.xojo.com/2013/11/17/writing-high-dpi-aware-windows-apps/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Sun, 17 Nov 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[HiDPi]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2013/11/17/writing-high-dpi-aware-windows-apps/</guid>

					<description><![CDATA[Today's laptops and monitors support high resolution displays which allow you to pack more information and content on the screen. Although one common complaint is that people find the text to be too small at the maximum resolution, Windows' solution to this is the ability for the user to adjust the DPI setting.]]></description>
										<content:encoded><![CDATA[<p>Today&#8217;s laptops and monitors support high resolution displays which allow you to pack more information and content on the screen. Although one common complaint is that people find the text to be too small at the maximum resolution, Windows&#8217; solution to this is the ability for the user to adjust the DPI setting.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2013/11/SetDPI-190.php"><img decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2013/11/setdpi-thumb-400x274-190.pngt1466486449161ampwidth400ampheight274" sizes="(max-width: 400px) 100vw, 400px" alt="SetDPI.png" width="400" height="274" /></a></p>
<p><span id="more-71"></span></p>
<p>At 150% resolution things get scaled 1.5 times which should make text more readable. However, if your app is not DPI-aware then Windows will scale your content for you, which results in a very blurry looking window.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2013/11/Blurry-193.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2013/11/blurry-thumb-400x448-193.pngt1466486449161ampwidth400ampheight448" sizes="auto, (max-width: 400px) 100vw, 400px" alt="Blurry.png" width="400" height="448" /></a>This DPI virtualization was introduced in Windows Vista, although they still support Windows XP style DPI scaling. The difference is that XP style DPI scaling doesn&#8217;t scale your content automatically, but does report the correct DPI resolution to your app (which we use to render text appropriately at the right size). With DPI virtualization your app does not receive the correct DPI resolution information (Windows lies about it) so we render text at the lower resolution and Windows takes over from there and scales your content automatically. The result is a blurry looking window.</p>
<h3>Enabling DPI-aware mode</h3>
<p>As more computer makers start shipping laptops with high-DPI settings preconfigured, being DPI-aware is increasingly important. We&#8217;re constantly trying to improve our framework to support things natively, and I&#8217;m confident at some point that you will not even have to think twice about whether or not your Xojo app is DPI-aware, but the one big challenge with high-DPI apps is resizing the controls correctly. However, this does not mean your Xojo app today can&#8217;t be DPI-aware with a little work on your part. There are two ways to tell Windows that your app is DPI-aware.</p>
<ol>
<li>Declare and call the Win32 SetProcessDPIAware API</li>
<li>Modify the embedded manifest in your Xojo .exe app</li>
</ol>
<h3>SetProcessDPIAware</h3>
<p>Let&#8217;s take a look at the simplist approach to enable your app to be DPI-aware. You can read up on this <a title="SetProcessDPIAware API" href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633543(v=vs.85).aspx">API here</a>. You&#8217;ll notice that Microsoft doesn&#8217;t recommend this approach in the case where a DLL would cache the DPI setting before SetProcessDPIAware is called. None of our DLLs currently cache the DPI so you&#8217;re fine as long as you don&#8217;t rely on other DLLs that might. You can setup this code in the App.Open event like so:</p>
<pre>Declare Function SetProcessDPIAware Lib "user32" () As Boolean
If Not SetProcessDPIAware Then
  MsgBox "Error enabling DPI aware mode."
End If
</pre>
<h3>Modifying the application manifest</h3>
<p>Modifying the application manifest is the suggested approach by Microsoft, but it requires the use of a resource editor like PE Explorer. A manifest is embedded in each Xojo app which describes some of the elements and attributes of your application. One such attribute is whether or not your app is dpi-aware. You can copy and paste this into the manifest resource in your Xojo app:</p>
<pre>&lt;application xmlns="urn:schemas-microsoft-com:asm.v3"&gt;
 &lt;windowsSettings&gt;
 &lt;dpiAware xmlns="http://schemas.microsoft.com/                       SMI/2005/WindowsSettings"&gt;true&lt;/dpiAware&gt;
 &lt;/windowsSettings&gt;
&lt;/application&gt;
</pre>
<h3>Results</h3>
<p>So what exactly does this get you? In normal DPI mode nothing really, now switch to high-DPI mode (say 150%). Now that you&#8217;ve told Windows that your app is DPI-aware it no longer virtualizes your interface (by scaling automatically). Your new interface should look something like this:</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2013/11/Cramped-196.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2013/11/cramped-thumb-400x404-196.pngt1466486449161ampwidth400ampheight404" sizes="auto, (max-width: 400px) 100vw, 400px" alt="Cramped.png" width="400" height="404" /></a></p>
<p>Notice that your text inherits the default system size, unless of course you&#8217;ve specified otherwise. The controls however, are not automatically scaled. Until we come out with an autolayout manager you&#8217;ll have to adjust the controls yourself. First, you must find the scale factor. A normal DPI resolution on Windows is 96, while at 150% it would be 144. Here&#8217;s some code to find this scale factor:</p>
<pre>Declare Function GetDC Lib "user32" (hWnd As Ptr) As Ptr 
Declare Function GetDeviceCaps Lib "gdi32" _
                  (hdc As Ptr, nIndex As Integer) As Integer 
Declare Sub ReleaseDC Lib "user32" (hWnd As Ptr, hdc As Ptr)

Const LOGPIXELSX = 88 
Const LOGPIXELSY = 90

Dim hdc As Ptr = GetDC(Nil) 
Dim dpiX As Integer = GetDeviceCaps(hdc, LOGPIXELSX) 
Dim dpiY As Integer = GetDeviceCaps(hdc, LOGPIXELSY) ReleaseDC(Nil, hdc)

Dim scaleFactorX As Double = dpiX / 96 
Dim scaleFactorY As Double = dpiY / 96</pre>
<p>Note how we&#8217;re finding both the X and Y DPI resolution. They are usually, but not always, the same. Knowing the scale factor you can now adjust your UI appropriately.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2013/11/ResizedControls-199.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2013/11/resizedcontrols-thumb-400x419-199.pngt1466486449161ampwidth400ampheight419" sizes="auto, (max-width: 400px) 100vw, 400px" alt="ResizedControls.png" width="400" height="419" /></a>If your controls rely on a fixed sized text, no matter what the resolution, you can always specify the TextUnit to be Pixel instead of Point and enter the size in pixels. This would allow you to ignore any scaling, but note how &#8220;off&#8221; your UI may feel.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2013/11/ReducedText-202.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2013/11/reducedtext-thumb-400x366-202.pngt1466486449161ampwidth400ampheight366" sizes="auto, (max-width: 400px) 100vw, 400px" alt="ReducedText.png" width="400" height="366" /></a></p>
<p>Note that for pictures that you display on screen you may also want to create multiple resolutions instead of scaling them.</p>
<h3>Conclusion</h3>
<p>Being a DPI-aware app on Windows is becoming increasingly important as resolutions grow larger but how you choose, or not choose, to support it is of course up to you. You may decide that it&#8217;s too much effort at this time to update your app, and continue to rely on Windows&#8217; inherent DPI virtualization to scale your app for you, or wait until we support it natively. You can choose to be somewhat DPI-aware and set the mode up (with the declare or manifest change mentioned) but leave all UI unscaled (in which case you would change all the TextUnits to Pixel), or you can be fully dpi-aware and scale/reposition all your controls as necessary.<!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
