首先来个金属仪表盘图

金属仪表盘、车载仪表盘 源代码下载 


纯代码实现GDI绘制仪表盘,效果在代码下面。



public partial class HalfDashboardUc : UserControl
{
/// <summary>
/// 仪表盘背景图片
/// </summary>
private Image dashboardImage; /// <summary>
/// 定义该仪表盘画布的最大值为371
/// </summary>
private int maxSize = ; /// <summary>
/// 仪表盘画布的放大倍数,默认1
/// </summary>
private float multiple = ; /// <summary>
/// 定义该仪表盘的直径大小
/// </summary>
private float diameter; /// <summary>
/// 每个间隔值
/// </summary>
private int intervalValue; /// <summary>
/// 仪表盘显示的最小值,默认为0
/// </summary>
private float minValue = ; /// <summary>
/// 仪表盘显示的最小值
/// </summary>
[Category("wyl")]
[Description("仪表盘显示的最小值")]
public float MinValue
{
get
{
return minValue;
}
set
{
if (value >= MaxValue)
{
MessageBox.Show("最小值不能超过最大值!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
minValue = ;
}
else
{
minValue = value;
//drawBackImage();
}
} } /// <summary>
/// 仪表盘上显示的最大值,默认123。
/// </summary>
private float maxValue = ; /// <summary>
/// 仪表盘上显示的最大值
/// </summary>
[Category("wyl")]
[Description("仪表盘上显示的最大值")]
public float MaxValue
{
get
{
return maxValue;
}
set
{
if (value <= MinValue)
{
MessageBox.Show("最大值不能低于最小值!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
maxValue = ;
}
else
{
maxValue = value;
//drawBackImage();
}
}
} // <summary>
/// 仪表盘变换的值,默认为0;
/// </summary>
private float changeValue = ; /// <summary>
/// 仪表盘变换的值
/// </summary>
public float ChangeValue
{
get
{
return changeValue;
}
set
{
changeValue = value;
}
} /// <summary>
/// 指针颜色
/// </summary>
private Color pinColor = Color.FromArgb(, , ); public Color PinColor
{
get
{
return pinColor;
}
set
{
pinColor = value;
}
} public HalfDashboardUc()
{
InitializeComponent();
//双缓存防止屏幕抖动
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.UpdateStyles();
//设置背景颜色为透明
this.BackColor = Color.Transparent;
} //private int uintfontsize = 40;
/// <summary>
/// 初始化仪表盘画布
/// </summary>
private void InitialCanvas()
{
//对比控件的长高,以最小值为仪表盘的半径
if (this.Width > * this.Height)
{
diameter = * this.Height - ;
}
else
{
diameter = this.Width - ;
}
multiple = (float)diameter / maxSize;//计算仪表盘放大倍数
//如果半径大于仪表盘的最大值,则设定放大倍数为默认值
if (multiple > )
{
multiple = ;
diameter = maxSize;
}
intervalValue = (int)((MaxValue - minValue) / );//计算每个间隔之间的值
} /// <summary>
/// 画底图
/// </summary>
private void drawBackImage()
{ Bitmap bit = new Bitmap(this.Width, this.Height);
Graphics gp = Graphics.FromImage(bit);
gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
float radius = diameter / ;//半径
float cerX = this.Width / ;
float cerY = this.Height / + radius / - * multiple;
//float cerY = this.Height - 20 ;
gp.TranslateTransform(cerX, cerY);//以中心点为画布的起始点
//gp.DrawPie(new Pen(new SolidBrush(Color.FromArgb(19,20,25)),3), -radius, -radius, diameter, diameter, 175, 190);
gp.DrawArc(new Pen(new SolidBrush(Color.FromArgb(, , )), ), -radius, -radius, diameter, diameter, , );
float x1 = (float)((radius) * Math.Cos( * Math.PI / ));
float y1 = (float)((radius) * Math.Sin( * Math.PI / ));
float x2 = (float)((radius) * Math.Cos( * Math.PI / ));
float y2 = (float)((radius) * Math.Sin( * Math.PI / ));
gp.DrawLine(new Pen(new SolidBrush(Color.FromArgb(, , )), ), x1, y1, x2, y2); //gp.DrawEllipse(new Pen(Brushes.Red), -5, -5, 10, 10);
float startRad = ;//起始角度
float sweepShot = ;//旋转角度
//gp.DrawLine(new Pen(Brushes.Red), -radius, 0, -(radius - 10), 0);
for (int i = ; i <= ; i++)
{
double rad = (sweepShot + startRad) * Math.PI / ;
if (i % == )
{
float px1 = (float)((radius - ) * Math.Cos(rad));
float py1 = (float)((radius - ) * Math.Sin(rad)); float px2 = (float)((radius - ) * Math.Cos(rad));
float py2 = (float)((radius - ) * Math.Sin(rad));
gp.DrawLine(new Pen(new SolidBrush(Color.FromArgb(, , )), ), px1, py1, px2, py2); }
else
{ float px1 = (float)((radius - ) * Math.Cos(rad));
float py1 = (float)((radius - ) * Math.Sin(rad)); float px2 = (float)((radius - ) * Math.Cos(rad));
float py2 = (float)((radius - ) * Math.Sin(rad));
gp.DrawLine(new Pen(new SolidBrush(Color.FromArgb(, , )), ), px1, py1, px2, py2);
}
sweepShot += ;
}
//刻度字体
Font scaleFont = new Font("宋体", , FontStyle.Bold);
startRad = ;//起始角度
sweepShot = ;//旋转角度
Color c1 = Color.FromArgb(, , );
for (int i = ; i < ; i++)
{
int tempValue = i * intervalValue;
SizeF tempSf = gp.MeasureString(tempValue.ToString(), scaleFont);
//计算角度值
double rad = (sweepShot + startRad) * Math.PI / ;
float px = (float)((radius - ) * Math.Cos(rad));
float py = (float)((radius - ) * Math.Sin(rad));
if (sweepShot == )
{
gp.DrawString(tempValue.ToString(), scaleFont, Brushes.Wheat, px - tempSf.Width / , py);
}
else if (sweepShot == )
{
gp.DrawString(tempValue.ToString(), scaleFont, new SolidBrush(c1), px - tempSf.Width + * multiple, py - tempSf.Height / + * multiple);
}
else if (sweepShot == )
{
gp.DrawString(tempValue.ToString(), scaleFont, new SolidBrush(c1), px - tempSf.Width, py - tempSf.Height / + * multiple);
}
else if (sweepShot == )
{
gp.DrawString(tempValue.ToString(), scaleFont, new SolidBrush(c1), px - tempSf.Width, py - tempSf.Height / ); }
//else if (sweepShot == 120)
//{
// gp.DrawString(tempValue.ToString(), scaleFont, new SolidBrush(c1), px - tempSf.Width, py - tempSf.Height / 2);
//}
sweepShot += ;
}
startRad = ;//起始角度
sweepShot = ;//旋转角度
for (int i = ; i < ; i++)
{
int tempValue = -i * intervalValue;
SizeF tempSf = gp.MeasureString(tempValue.ToString(), scaleFont);
//计算角度值
double rad = (sweepShot + startRad) * Math.PI / ;
float px = (float)((radius - * multiple) * Math.Cos(rad));
float py = (float)((radius - * multiple) * Math.Sin(rad));
if (sweepShot == -)
{
gp.DrawString(tempValue.ToString(), scaleFont, Brushes.Red, px, py + tempSf.Height / );
}
else if (sweepShot == -)
{
gp.DrawString(tempValue.ToString(), scaleFont, Brushes.Red, px + tempSf.Width / - * multiple, py + tempSf.Height / - * multiple);
}
else if (sweepShot == -)
{
gp.DrawString(tempValue.ToString(), scaleFont, Brushes.Red, px + tempSf.Width/ , py - tempSf.Height / ); } sweepShot -= ;
} gp.Dispose();
this.BackgroundImage = bit;
} /// <summary>
/// 画图
/// </summary>
/// <param name="g"></param>
private void DrawPin(Graphics g)
{
Bitmap bit = new Bitmap(this.Width, this.Height);
Graphics gp = Graphics.FromImage(bit);
gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
float radius = diameter / ;//半径
float startRad = ;//起始角度
float sweepShot = (float)(ChangeValue / MaxValue * );//旋转角度
float cerX = this.Width / ;
float cerY = this.Height / + radius / - * multiple;
gp.TranslateTransform(cerX, cerY);//以中心点为画布的起始点
//gp.DrawEllipse(new Pen(PinColor, 1), -5, -5, 10, 10);//画中心圆圈
double rad = (sweepShot + startRad) * Math.PI / ;//计算角度
float px = (float)((radius - ) * Math.Cos(rad));
float py = (float)((radius - ) * Math.Sin(rad));
PointF[] pf = new PointF[] { new PointF(, -radius + ), new PointF(-, ), new PointF(, ) };
gp.RotateTransform(sweepShot);
//PointF[] pf = new PointF[] { new PointF(px, py), new PointF(-4, 0), new PointF(4, 0) };
gp.FillPolygon(new SolidBrush(PinColor), pf); //gp.DrawLine(new Pen(new SolidBrush(PinColor), 3f), 0, 0, px, py); g.DrawImage(bit, , );
gp.Dispose();
} private void HalfDashboardUc_Load(object sender, EventArgs e)
{
InitialCanvas();
drawBackImage();
} private void HalfDashboardUc_Paint(object sender, PaintEventArgs e)
{
DrawPin(e.Graphics);
} private void HalfDashboardUc_Resize(object sender, EventArgs e)
{
InitialCanvas();
drawBackImage();
}
}

效果实现如下:

金属仪表盘下载地址 https://pan.baidu.com/s/1xANmSkQYnLGzUJ_X8Dbg0w   提取码:fi96

C# GDI绘制仪表盘(纯代码实现)的更多相关文章

  1. GDI绘制时钟效果,与系统时间保持同步,基于Winform

    2018年工作之余,想起来捡起GDI方面的技术,特意在RichCodeBox项目中做了两个示例程序,其中一个就是时钟效果,纯C#开发.这个CSharpQuartz是今天上午抽出一些时间,编写的,算是偷 ...

  2. 通过GDI+绘制 验证码

    只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...

  3. C#利用GDI+绘制旋转文字等效果

    C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...

  4. C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤

    通过上面的效果截图可以看到,重绘后的MenuStrip和ContextMenuStrip可以添加自己的LOGO信息,实现了类似OFFICE2007的菜单显示效果. .NET对菜单控件的绘制提供了一个抽 ...

  5. MFC 用gdi绘制填充多边形区域

    MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 CBrush br(RGB( ...

  6. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

  7. C#GDI+ 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆

    C#GDI+ 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. Graphics graphics = e.Graphics; //绘制实线 )) { pen ...

  8. 使用Java纯代码实现MySQL的连接

      建立数据库 1. 点击连接-->MySQL: 输入连接名 . 主机名/IP地址 .端口 .用户名.密码(没有密码就省略),然后点击确定,建立的表格是灰色表示关闭状态,双击开启 2. 重新创建 ...

  9. swift 之 纯代码创建 cell

    初学swift 但是网上只有很多swift用xib创建的cell,就算是有也不是我想要的.今天自己弄了一个不用xib纯代码写的,来上代码 博客地址: https://github.com/liguol ...

随机推荐

  1. while do while以及穷举和迭代

    今天的新内容1:while循环 格式: while() { } 初始状态要在循环外提前规定 状态改变要写在花括号里面 括号内是循环条件 for循环与while循环的对比: 2:do while 不管循 ...

  2. Unity项目在亚马逊KindleFire设备上旋转不正确的解决方案

    前提:      在亚马逊设备上,总部要求发布的版本必须使用LandscapeLeft方向.按照经验,在UnityPlayerSettings中设置Orientation即可.   问题表现:     ...

  3. 7 -- Spring的基本用法 -- 8...

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  4. 获取Camera 支持视频的尺寸

    <uses-permission android:name="android.permission.CAMERA" > </uses-permission> ...

  5. python paramiko模拟ssh登录,实现sftp上传或者下载文件

    Python Paramiko模块的安装与使用详解 paramiko是短链接,不是持续链接,只能执行你设定的shell命令,可以加分号执行两次命令. http://www.111cn.net/phpe ...

  6. PHP异常处理机制

    1. 异常: 异常(Exception)用于在指定的错误发生时改变脚本的正常流程. 当异常被触发时,通常会发生: (1)当前代码状态被保存: (2)代码执行被切换到预定义的异常处理器函数: (3)根据 ...

  7. 【XSY2849】陈姚班 平面图网络流 最短路 DP

    题目描述 有一个\(n\)行\(m\)列的网格图. \(S\)到第一行的每一个点都有一条单向边,容量为\(\infty\). 最后一行的每个点到\(T\)都有一条单向边,容量为\(\infty\). ...

  8. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  9. MySQL(六)

    自关联 设计省信息的表结构provinces id ptitle 设计市信息的表结构citys id ctitle proid citys表的proid表示城市所属的省,对应着provinces表的i ...

  10. Lakeshore 中文开发界面,示例项目,飞机大战 等 Lakeshore Chinese development interface, sample project, aircraft war, etc

    Lakeshore 中文开发界面,示例项目,飞机大战 等 Lakeshore Chinese development interface, sample project, aircraft war, ...