工作中需要用到指针仪表盘显示数据,发觉网络上虽然分享的不少,但是源码不多.
这里分享和分析一个仪表盘控件的绘制;
效果图:
绘制内容上稍微单调,具体需要什么再添加吧.
-----------------------------------------------------------------------
首先贴代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class InstrumentPanel : UserControl
{
public InstrumentPanel()
{
InitializeComponent();
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
}
public Color _backColor { get; set; } = Color.Green;
public Color _frameColor { get; set; } = Color.Blue;
public Color _pinColor { get; set; } = Color.Red;
public Color _valueColor { get; set; } = Color.Black;
public Color _fillColor { get; set; } = Color.Gray;
public string UintString { get; set; } = "mA";
private double _minValue = 0;
public double MinValue
{
get { return _minValue; }
set
{
_minValue = value;
if (Value <= _minValue)
{
Value = _minValue;
}
//绘制
this.Invalidate();
}
}
private double _maxValue = 10000;
public double MaxValue
{
get { return _maxValue; }
set
{
_maxValue = value;
if (Value > _maxValue)
{
Value = _maxValue;
}
//绘制
this.Invalidate();
}
}
private double _Value = 0;
public double Value
{
get { return _Value; }
set
{
double oldvalue = _Value;
if (value > _maxValue)
{
_Value = _maxValue;
}
else if (value < _minValue)
{
_Value = _minValue;
}
else
{
_Value = value;
}
OnValueChanged?.BeginInvoke(this, oldvalue, _Value, null, null);
//绘制
this.Invalidate();
}
}
public delegate void OnValueChangedEventHandler(object sender, double value, double newvalue);
public event OnValueChangedEventHandler OnValueChanged;
/// <summary>
/// 画外框
/// </summary>
private void drawFrame(Graphics gp,Point cer,in