C#使用GDI绘制格尺

本文介绍如何使用C#的GDI绘制一个毫米标尺,探讨尺寸确定、防止重绘时闪烁的方法,以及如何进行毫米与像素的转换。通过GetDeviceCaps API获取设备信息,实现精确的尺寸计算。
摘要由CSDN通过智能技术生成

使用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;
}</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值