342 lines
10 KiB
C#
342 lines
10 KiB
C#
using System;
|
|||
|
|
using System.ComponentModel;
|
||
|
|
using System.Drawing;
|
||
|
|
using System.Windows.Forms;
|
||
|
|
|
||
|
|
namespace JinYuan.ControlLib
|
||
|
|
{
|
||
|
|
public partial class DialPlate : UserControl
|
||
|
|
{
|
||
|
|
public DialPlate()
|
||
|
|
{
|
||
|
|
InitializeComponent();
|
||
|
|
|
||
|
|
//设置控件样式,去除缓冲
|
||
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
||
|
|
this.SetStyle(ControlStyles.DoubleBuffer, true);
|
||
|
|
this.SetStyle(ControlStyles.ResizeRedraw, true);
|
||
|
|
this.SetStyle(ControlStyles.Selectable, true);
|
||
|
|
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
|
||
|
|
|
||
|
|
stringFormat.Alignment = StringAlignment.Center;
|
||
|
|
stringFormat.LineAlignment = StringAlignment.Center;
|
||
|
|
}
|
||
|
|
|
||
|
|
private StringFormat stringFormat = new StringFormat();
|
||
|
|
|
||
|
|
#region 外环设计
|
||
|
|
private Color alarmColor = Color.FromArgb(36, 184, 196);
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取报警颜色")]
|
||
|
|
public Color AlarmColor
|
||
|
|
{
|
||
|
|
get { return alarmColor; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
alarmColor = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private Color rightColor = Color.FromArgb(187, 187, 187);
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取圆环整体颜色")]
|
||
|
|
public Color RightColor
|
||
|
|
{
|
||
|
|
get { return rightColor; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
rightColor = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private float alarmAngle = 120.0f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取报警角度")]
|
||
|
|
public float AlarmAngle
|
||
|
|
{
|
||
|
|
get { return alarmAngle; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
alarmAngle = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private int outThickness = 8;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取外环宽度")]
|
||
|
|
public int OutThickness
|
||
|
|
{
|
||
|
|
get { return outThickness; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
outThickness = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
#region 内环设计
|
||
|
|
private float tempScale = 0.8f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取温度环比列,默认小于1.0f")]
|
||
|
|
public float TempScale
|
||
|
|
{
|
||
|
|
get { return tempScale; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value > 1.0f) return;
|
||
|
|
tempScale = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private Color tempColor = Color.FromArgb(36, 184, 196);
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取温度环颜色")]
|
||
|
|
public Color TempColor
|
||
|
|
{
|
||
|
|
get { return tempColor; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
tempColor = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private float humidityScale = 0.4f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取湿度环比列,默认小于1.0f")]
|
||
|
|
public float HumidityScale
|
||
|
|
{
|
||
|
|
get { return humidityScale; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value > 1.0f) return;
|
||
|
|
humidityScale = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private Color humidityColor = Color.FromArgb(36, 184, 196);
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取湿度环颜色")]
|
||
|
|
public Color HumidityColor
|
||
|
|
{
|
||
|
|
get { return humidityColor; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
humidityColor = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private int inThickness = 16;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取内环宽度")]
|
||
|
|
public int InThickness
|
||
|
|
{
|
||
|
|
get { return inThickness; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
inThickness = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
#region 刻度环设计
|
||
|
|
private float textScale = 0.6f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取刻度环比列,默认小于1.0f")]
|
||
|
|
public float MyProperty
|
||
|
|
{
|
||
|
|
get { return textScale; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value > 1.0f) return;
|
||
|
|
textScale = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private float rangeMin = 0.0f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取刻度量程低限")]
|
||
|
|
public float RangeMin
|
||
|
|
{
|
||
|
|
get { return rangeMin; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value > rangeMax) return;
|
||
|
|
rangeMin = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private float rangeMax = 90.0f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取刻度量程高限")]
|
||
|
|
public float RangeMax
|
||
|
|
{
|
||
|
|
get { return rangeMax; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value < rangeMin) return;
|
||
|
|
rangeMax = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
#region 实时显示
|
||
|
|
private float temp = 10.0f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取温度实时值")]
|
||
|
|
public float Temp
|
||
|
|
{
|
||
|
|
get { return temp; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value < rangeMin)
|
||
|
|
value = rangeMin;
|
||
|
|
if (value > rangeMax)
|
||
|
|
value = rangeMax;
|
||
|
|
temp = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private float humidity = 10.0f;
|
||
|
|
[Browsable(true)]
|
||
|
|
[Category("自定义属性")]
|
||
|
|
[Description("设置或获取湿度实时值")]
|
||
|
|
public float Humidity
|
||
|
|
{
|
||
|
|
get { return humidity; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value < rangeMin)
|
||
|
|
value = rangeMin;
|
||
|
|
if (value > rangeMax)
|
||
|
|
value = rangeMax;
|
||
|
|
humidity = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
|
||
|
|
protected override void OnPaint(PaintEventArgs e)
|
||
|
|
{
|
||
|
|
base.OnPaint(e);
|
||
|
|
|
||
|
|
//获取画布并设置
|
||
|
|
Graphics g = e.Graphics;
|
||
|
|
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
||
|
|
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
|
||
|
|
|
||
|
|
//异常情况处理
|
||
|
|
if (this.Width <= 20 || this.Height <= 20) return;
|
||
|
|
|
||
|
|
if (this.Height < this.Width / 2) return;
|
||
|
|
|
||
|
|
//画外环
|
||
|
|
Pen pen = new Pen(alarmColor, OutThickness);
|
||
|
|
|
||
|
|
g.DrawArc(pen, new RectangleF(10, 10, this.Width - 20, this.Width - 20), 180, alarmAngle);
|
||
|
|
|
||
|
|
pen = new Pen(rightColor, OutThickness);
|
||
|
|
|
||
|
|
g.DrawArc(pen, new RectangleF(10, 10, this.Width - 20, this.Width - 20), 180 + alarmAngle, 180 - alarmAngle);
|
||
|
|
|
||
|
|
//转移坐标系
|
||
|
|
g.TranslateTransform(this.Width * 0.5f, this.Width * 0.5f);
|
||
|
|
|
||
|
|
//旋转坐标系
|
||
|
|
g.RotateTransform(-90);
|
||
|
|
|
||
|
|
SolidBrush solidBrush;
|
||
|
|
for (int i = 0; i < 7; i++)
|
||
|
|
{
|
||
|
|
if (30 * i <= alarmAngle)
|
||
|
|
{
|
||
|
|
solidBrush = new SolidBrush(alarmColor);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
solidBrush = new SolidBrush(rightColor);
|
||
|
|
}
|
||
|
|
float x = -0.3f;
|
||
|
|
float width = 6.0f;
|
||
|
|
float height = outThickness + 4;
|
||
|
|
float y = (this.Width * 0.5f - 10 + height * 0.5f) * (-1.0f);
|
||
|
|
g.FillRectangle(solidBrush, new RectangleF(x, y, width, height));
|
||
|
|
|
||
|
|
g.RotateTransform(30);
|
||
|
|
}
|
||
|
|
|
||
|
|
//坐标系旋转回去
|
||
|
|
g.RotateTransform(-210);
|
||
|
|
g.RotateTransform(90);
|
||
|
|
|
||
|
|
////绘制刻度
|
||
|
|
float rangeAvg = ((rangeMax - rangeMin) % 6 == 0) ? Convert.ToSingle((rangeMax - rangeMin) / 6) : Convert.ToSingle(((rangeMax - rangeMin) / 6).ToString("f1"));
|
||
|
|
|
||
|
|
for (int i = 0; i < 7; i++)
|
||
|
|
{
|
||
|
|
float angle = -180.0f + i * 30.0f;
|
||
|
|
|
||
|
|
float pointX = Convert.ToSingle(this.Width * textScale * 0.5f * Math.Cos(angle * Math.PI / 180.0f));
|
||
|
|
float pointY = Convert.ToSingle(this.Width * textScale * 0.5f * Math.Sin(angle * Math.PI / 180.0f));
|
||
|
|
|
||
|
|
string text = (rangeMin + rangeAvg * i).ToString();
|
||
|
|
|
||
|
|
SizeF size = g.MeasureString(text, this.Font);
|
||
|
|
|
||
|
|
RectangleF rectangle = new RectangleF(pointX - size.Width * 0.5f, pointY, size.Width, size.Height);
|
||
|
|
|
||
|
|
g.DrawString(text, this.Font, new SolidBrush(this.ForeColor), rectangle, stringFormat);
|
||
|
|
}
|
||
|
|
|
||
|
|
////绘制实际温度湿度环
|
||
|
|
//pen = new Pen(tempColor, inThickness);
|
||
|
|
|
||
|
|
//float sweepAngle = (temp - rangeMin) / (rangeMax - rangeMin) * 180.0f;
|
||
|
|
|
||
|
|
//float xx = this.Width * tempScale * 0.5f * (-1.0f);
|
||
|
|
//float yy = this.Width * tempScale * 0.5f * (-1.0f);
|
||
|
|
|
||
|
|
//g.DrawArc(pen, new RectangleF(xx, yy, this.Width * tempScale, this.Width * tempScale), 180.0f, sweepAngle);
|
||
|
|
|
||
|
|
|
||
|
|
//pen = new Pen(humidityColor, inThickness);
|
||
|
|
|
||
|
|
//sweepAngle = (humidity - rangeMin) / (rangeMax - rangeMin) * 180.0f;
|
||
|
|
|
||
|
|
//xx = this.Width * humidityScale * 0.5f * (-1.0f);
|
||
|
|
//yy = this.Width * humidityScale * 0.5f * (-1.0f);
|
||
|
|
|
||
|
|
//g.DrawArc(pen, new RectangleF(xx, yy, this.Width * humidityScale, this.Width * humidityScale), 180.0f, sweepAngle);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|