You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.4 KiB
C#

9 months ago
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);
}
}