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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}