使用C#绘制一个标尺,其实是在学习Gdi绘图的一些知识,也在试验出好多人平时总问的一个问题,一个毫米等于多少像素,同时自己也了解了在图形中尺寸是怎么计算的。
1.尺寸的确定
在使用标尺测试控件的宽度时,一个像素是指起始点开始后一个像素点才为一个像素,我总是认为一个像素就是屏幕上的一个格子。
2.如何使用重绘时不闪烁
在网上找到许多人的文章,代码如下,收藏之:
private void InitControl()
{
InitializeComponent();
//减少闪烁
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
3.Onpaint的参数中ClipRectangle为需重绘矩形区域,不要误认为是ClientRectangle。
4.毫米与像素的换算,其实是依赖于显示设备的和分辨率以及DPI的,需要使用API确定这些值后,经过换算就可以得到。
public static double MillimetersToPixelsWidth(IntPtr hDc, double length)
{
//以毫米为单位的显示器宽度
int width = NativeMethods.GetDeviceCaps(hDc, NativeMethods.CapIndex.HORZSIZE); // 4
//像素数量
int pixels = NativeMethods.GetDeviceCaps(hDc, NativeMethods.CapIndex.HORZRES); //8
return (((double)pixels / (double)width) * (double)length);
}
public static double PixelsToMillimetersWidth(IntPtr hDc, double length)
{
int width = NativeMethods.GetDeviceCaps(hDc, NativeMethods.CapIndex.HORZSIZE);
int pixels = NativeMethods.GetDeviceCaps(hDc, NativeMethods.CapIndex.HORZRES);
return (double)width / (double)pixels * (double)length;
}</