using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace POSV.Utils { /// /// dpi转换工具类 /// public class DpiUtils { static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public static int GetOneMmPointInt(int dpi) { int mmPoint = 0; switch (dpi) { case 200: case 203: mmPoint = 8; break; case 300: mmPoint = 12; break; case 600: mmPoint = 24; break; } return mmPoint; } /// /// 打印机点转像素 /// /// /// /// public static int DotsToPixels(float screenDpi, int dots, int printerDpi) { int mmPoint = GetOneMmPointInt(printerDpi); double milli = ((double)dots / (double)mmPoint); return Convert.ToInt32(MillimetersToPixels(screenDpi, milli)); } /// /// 像素转打印机点 /// /// /// /// public static int PixelsToDots(float screenDpi, int pixel, int printerDpi) { double milli = PixelsWidthToMillimeters(screenDpi, pixel); return MillimetersToDots(printerDpi, milli); } /// /// 毫米转打印机点数 /// /// /// /// public static int MillimetersToDots(int dpi, double milli) { int oneMMPoint = GetOneMmPointInt(dpi); return Convert.ToInt16(milli * oneMMPoint); } /// /// 显示器像素转换为毫米 /// /// /// public static double PixelsWidthToMillimeters(float screenDpi, int pixel) { double oneMilliPixels = MillimetersToPixels(screenDpi, 1.0); return ((double)pixel / oneMilliPixels); } /// /// 获取当前显示器毫米转换为像素 /// /// 毫米 /// public static int MillimetersToPixels(double length) //length是毫米,1厘米=10毫米 { return MillimetersToPixels(GetScreenDpi(), length); } /// /// 获取指定显示器dpi毫米转换为像素 /// /// 显示器dpi /// 毫米 /// public static int MillimetersToPixels(float screenDpi, double length) //length是毫米,1厘米=10毫米 { //IntPtr hdc = g.GetHdc(); //int width = GetDeviceCaps(hdc, 4); // HORZRES //int pixels = GetDeviceCaps(hdc, 8); // BITSPIXEL ////int result = Convert.ToInt16(length / 25.38 * GetDeviceCaps(hdc, 88) + 0.5); //g.ReleaseHdc(hdc); //return Convert.ToInt16((((double)pixels / (double)width) * (double)length)); // return result; int result = Convert.ToInt16(screenDpi / 25.4f * length); return result; } public static int GetStrNumOneRow(int printerDpi, double milli) { var totalDot = MillimetersToDots(printerDpi, milli); return totalDot / 12; } /// /// 获取显示器Dpi /// /// public static float GetScreenDpi() { float result = 0; System.Windows.Forms.Panel p = new System.Windows.Forms.Panel(); System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(p.Handle); result = g.DpiX; g.Dispose(); return result; } [DllImport("gdi32.dll")] private static extern int GetDeviceCaps(IntPtr hdc, int Index); } }