/************************************************************************************* Extended WPF Toolkit Copyright (C) 2007-2013 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, pick up the Plus Edition at http://xceed.com/wpf_toolkit Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids ***********************************************************************************/ /**************************************************************************\ Copyright Microsoft Corporation. All Rights Reserved. \**************************************************************************/ namespace Standard { using System; using System.Diagnostics.CodeAnalysis; using System.Windows; using System.Windows.Media; internal static class DpiHelper { private static Matrix _transformToDevice; private static Matrix _transformToDip; [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] static DpiHelper() { using (SafeDC desktop = SafeDC.GetDesktop()) { // Can get these in the static constructor. They shouldn't vary window to window, // and changing the system DPI requires a restart. int pixelsPerInchX = NativeMethods.GetDeviceCaps(desktop, DeviceCap.LOGPIXELSX); int pixelsPerInchY = NativeMethods.GetDeviceCaps(desktop, DeviceCap.LOGPIXELSY); _transformToDip = Matrix.Identity; _transformToDip.Scale(96d / (double)pixelsPerInchX, 96d / (double)pixelsPerInchY); _transformToDevice = Matrix.Identity; _transformToDevice.Scale((double)pixelsPerInchX / 96d, (double)pixelsPerInchY / 96d); } } /// /// Convert a point in device independent pixels (1/96") to a point in the system coordinates. /// /// A point in the logical coordinate system. /// Returns the parameter converted to the system's coordinates. public static Point LogicalPixelsToDevice(Point logicalPoint) { return _transformToDevice.Transform(logicalPoint); } /// /// Convert a point in system coordinates to a point in device independent pixels (1/96"). /// /// A point in the physical coordinate system. /// Returns the parameter converted to the device independent coordinate system. public static Point DevicePixelsToLogical(Point devicePoint) { return _transformToDip.Transform(devicePoint); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static Rect LogicalRectToDevice(Rect logicalRectangle) { Point topLeft = LogicalPixelsToDevice(new Point(logicalRectangle.Left, logicalRectangle.Top)); Point bottomRight = LogicalPixelsToDevice(new Point(logicalRectangle.Right, logicalRectangle.Bottom)); return new Rect(topLeft, bottomRight); } public static Rect DeviceRectToLogical(Rect deviceRectangle) { Point topLeft = DevicePixelsToLogical(new Point(deviceRectangle.Left, deviceRectangle.Top)); Point bottomRight = DevicePixelsToLogical(new Point(deviceRectangle.Right, deviceRectangle.Bottom)); return new Rect(topLeft, bottomRight); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static Size LogicalSizeToDevice(Size logicalSize) { Point pt = LogicalPixelsToDevice(new Point(logicalSize.Width, logicalSize.Height)); return new Size { Width = pt.X, Height = pt.Y }; } public static Size DeviceSizeToLogical(Size deviceSize) { Point pt = DevicePixelsToLogical(new Point(deviceSize.Width, deviceSize.Height)); return new Size(pt.X, pt.Y); } } }