在C#中是以像素作为尺寸单位的,像素是一种相对的尺寸概念,与毫米的转换跟当前显示器的分辨率有关,在不同分辨率下转换的系数也不同。
借助C#中的GDI可以实现像素与毫米的换算:
一、根据Win32 API定义函数获取显示器设备信息:
///
/// 获取设备信息
///
/// 要查询设备的句柄
/// 设备信息所在的索引值
/// 返回对应索引值上的设备信息
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, int index);
二、根据显示器设备信息计算像素与毫米的换算比率:
// 定义获取Graphics对象所需的控件
Panel panel = new Panel();
// 根据控件所在句柄获取Graphics对象
Graphics graphics = Graphics.FromHwnd(panel.Handle);
// 获取设备句柄
IntPtr hdc = graphics.GetHdc();
// 获取屏幕宽度(毫米)HORZSIZE
int width = GetDeviceCaps(hdc, 4);
// 获取屏幕高度(毫米)VERTSIZE
int height = GetDeviceCaps(hdc, 6);
// 获取屏幕宽度(像素)HORZRES
int xPixels = GetDeviceCaps(hdc, 8);
// 获取屏幕高度(像素)VERTRES
int yPixels = GetDeviceCaps(hdc, 10);
// 释放设备句柄
graphics.ReleaseHdc(hdc);
// 释放Graphics对象
graphics.Dispose();
// 计算X轴方向像素与毫米的比率
double xRate = (double)xPixels / (double)width;
// 计算Y轴方向像素与毫米的比率
double yRate = (double)yPixels / (double)height;
三、像素数换算为毫米数:
// 定义要换算的毫米数
double millimeter = 10;
// 计算X轴方向像素数
int xPixel = (int)Math.Round(xRate * millimeter);
// 计算Y轴方向像素数
int yPixel = (int)Math.Round(yRate * millimeter);
四、毫米数换算为像素数:
// 定义要换算的像素数
int pixel = 10;
// 计算X轴方向毫米数
double xMillimeter = pixel / xRate;
// 计算Y轴方向毫米数
double yMillimeter = pixel / yRate;