|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Runtime.InteropServices;
|
|
|
using System.Text;
|
|
|
|
|
|
namespace POSV.Utils
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// dpi转换工具类
|
|
|
/// </summary>
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 打印机点转像素
|
|
|
/// </summary>
|
|
|
/// <param name="dots"></param>
|
|
|
/// <param name="dpi"></param>
|
|
|
/// <returns></returns>
|
|
|
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));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 像素转打印机点
|
|
|
/// </summary>
|
|
|
/// <param name="pixel"></param>
|
|
|
/// <param name="dpi"></param>
|
|
|
/// <returns></returns>
|
|
|
public static int PixelsToDots(float screenDpi, int pixel, int printerDpi)
|
|
|
{
|
|
|
double milli = PixelsWidthToMillimeters(screenDpi, pixel);
|
|
|
return MillimetersToDots(printerDpi, milli);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 毫米转打印机点数
|
|
|
/// </summary>
|
|
|
/// <param name="dpi"></param>
|
|
|
/// <param name="milli"></param>
|
|
|
/// <returns></returns>
|
|
|
public static int MillimetersToDots(int dpi, double milli)
|
|
|
{
|
|
|
int oneMMPoint = GetOneMmPointInt(dpi);
|
|
|
return Convert.ToInt16(milli * oneMMPoint);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 显示器像素转换为毫米
|
|
|
/// </summary>
|
|
|
/// <param name="pixel"></param>
|
|
|
/// <returns></returns>
|
|
|
public static double PixelsWidthToMillimeters(float screenDpi, int pixel)
|
|
|
{
|
|
|
double oneMilliPixels = MillimetersToPixels(screenDpi, 1.0);
|
|
|
return ((double)pixel / oneMilliPixels);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取当前显示器毫米转换为像素
|
|
|
/// </summary>
|
|
|
/// <param name="length">毫米</param>
|
|
|
/// <returns></returns>
|
|
|
public static int MillimetersToPixels(double length) //length是毫米,1厘米=10毫米
|
|
|
{
|
|
|
return MillimetersToPixels(GetScreenDpi(), length);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取指定显示器dpi毫米转换为像素
|
|
|
/// </summary>
|
|
|
/// <param name="screenDpi">显示器dpi</param>
|
|
|
/// <param name="length">毫米</param>
|
|
|
/// <returns></returns>
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取显示器Dpi
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
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);
|
|
|
}
|
|
|
}
|