As we mentioned in our last post on High-DPI, the work needed to accommodate per-monitor DPI scaling in Windows 8.1 has also created the ability to scale OpenInsight forms to an arbitrary value outside of any system DPI settings. This new functionality is exposed via the SCALEFACTOR property described below.
This WINDOW property is a dynamic array comprising four fields:
<1> ScaleFactor <2> Minimum ScaleFactor <3> Maximum ScaleFactor <4> ScaleFactor Increment
This is a number that specifies how much to scale the form by. A value of 1 means that the form has no scaling applied, a value of 1.5 scales the form to one-and-a-half times its normal size and so on.
Note that the scale factor is applied after any scaling applied for system DPI. So, if your form runs on a 144 DPI monitor (150%) and has a scalefactor of 2 applied the actual scalefactor used is 3.0 (1.5 x 2.0).
<2> Minimum ScaleFactor
This specifies the minimum value that the ScaleFactor can be set to. By default it is set to “0.1”. This value can be set at design time. See the note on “Scaling Restrictions” below.
<3> Maximum ScaleFactor
This specifies the maximum value that the ScaleFactor can be set to. By default it is set to “5.0”. This value can be set at design time. See the note on “Scaling Restrictions” below.
<4> ScaleFactor Increment
If this field is set to a value other than 0 it allows the ScaleFactor to be adjusted via the Mouse-wheel /Ctrl-key combination, or with a “pinch-zoom” gesture if running under a touch screen. The increment value controls the rate at which the form grows or shrinks. This value can be set at design time.
Example 1: Set a form’s scale to twice its designed size while allowing the user to adjust the scalefactor by the mouse or touchscreen:
* // Note that we ignore the min and max scalefactors, leaving them at their * // defaults. scaleFactor = "" scaleFactor<1> = 2 ; * // twice normal size scaleFactor<4> = 0.1 ; * // allow mousewheel/gesture - each wheel notch ; * // adjusts the scalefactor by 0.1
Example 2: Comparing OpenInsight forms with a SCALEFACTOR of 0.5 and 1.0 respectively (both running on a 144 DPI desktop with DPISCALING disabled)
Example 3: Comparing OpenInsight forms with a SCALEFACTOR of 1.0 and 1.7 respectively (both running on a 144 DPI desktop with DPISCALING disabled)
DPI Image Lists and Image Scaling
In Example 3 above note the quality of the magnifying glass glyph on the buttons in the scaled form: it is much clearer and sharper on the Search button than it is on the Split button. This is because the Search button was designed using a “DPI Image List”, which means that an array of images, along with a corresponding array of DPI values, was specified for this glyph rather than just a single image. OpenInsight scans this DPI Image List looking for the closest match it can find when performing a scaling operation. By contrast the Split button is using a single image designed for 96 DPI and stretched to fit, resulting in a blurry appearance.
(Note: We first mentioned this functionality in the section “Supporting images under High-DPI” in our original High-DPI post).
Or course, you may also find yourself in the position of not wanting a particular image scaled, and in this case we’ve added a new property to the Image API called IMAGEAUTOSCALE. This is a simple boolean property that controls if an image is scaled by the system during the scaling process. It’s default value is TRUE.
(We’ve also added a similar property to other areas of the system that use images as well, so there is a GLYPHAUTOSCALE property, a SPLITGLYPHAUTOSCALE property and so on).
The minimum and maximum size that a form can be rescaled to can be restricted by the minimum and maximum window sizes as defined by the OS. As a general rule this size is usually slightly larger than the size of the entire desktop across all monitors (See the GetSystemMetrics() Windows API function along with the indexes SM_CXMAXTRACK, SM_CXMINTRACK, SM_CYMAXTRACK, and SM_CYMINTRACK for more details).
You can, however, override this behaviour if you set the TRACKINGSIZE property for a form, specifying values large enough to handle your desired scaling range.
* // Example - Ensure the form will actually scale to the min and max factors * // we've set winSize = get_Property( @window, "SIZE" ) scaleFactor = get_Property( @window, "SCALEFACTOR" ) trackingSize = "" trackingSize<1> = winSize<3> * scaleFactor<2> trackingSize<2> = winSize<4> * scaleFactor<2> trackingSize<3> = winSize<3> * scaleFactor<3> trackingSize<4> = winSize<4> * scaleFactor<3> call set_Property( @window, "TRACKINGSIZE", trackingSize )
In our next post we’ll take a look at the new SCALED event and discuss how to interact with the system during a scaling operation.
(Disclaimer: This article is based on preliminary information and may be subject to change in the final release version of OpenInsight 10).
Pingback: The SCALED event | Building OpenInsight 10