C# DIP坐标转像素px坐标
方法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public void TransformToPixels(double unitX, double unitY, out int pixelX, out int pixelY) { using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) { pixelX = (int)((g.DpiX / 96) * unitX); pixelY = (int)((g.DpiY / 96) * unitY); } // alternative: // using (Graphics g = Graphics.FromHdc(IntPtr.Zero)) { } } |
方法二(WIN32API方式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hDc, int nIndex); [DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hWnd); [DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDc); public const int LOGPIXELSX = 88; public const int LOGPIXELSY = 90; public void TransformToPixels(double unitX, double unitY, out int pixelX, out int pixelY) { IntPtr hDc = GetDC(IntPtr.Zero); if (hDc != IntPtr.Zero) { int dpiX = GetDeviceCaps(hDc, LOGPIXELSX); int dpiY = GetDeviceCaps(hDc, LOGPIXELSY); ReleaseDC(IntPtr.Zero, hDc); pixelX = (int)(((double)dpiX / 96) * unitX); pixelY = (int)(((double)dpiY / 96) * unitY); } else throw new ArgumentNullException("Failed to get DC."); } |
方法三(不推荐):
读取注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI 的DWORD值
方法四(WPF方式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public void TransformToPixels(Visual visual, double unitX, double unitY, out int pixelX, out int pixelY) { Matrix matrix; var source = PresentationSource.FromVisual(visual); if (source != null) { matrix = source.CompositionTarget.TransformToDevice; } else { using (var src = new HwndSource(new HwndSourceParameters())) { matrix = src.CompositionTarget.TransformToDevice; } } pixelX = (int)(matrix.M11 * unitX); pixelY = (int)(matrix.M22 * unitY); } |
性能方面,方法四要比方法二快两倍
如果您对C#游戏开发感兴趣,可以扫下面二维码加入我们的QQ群来一起学习交流
原创文章,转载请注明本文链接地址(违者必究):C# DIP坐标转像素px坐标