using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace DrawMeter
{
public partial class DrawMeter : UserControl
{
#region 构造函数
public DrawMeter()
{
InitializeComponent();
if (pnlMeter.Height != pnlMeter.Width)
{
if (pnlMeter.Height > pnlMeter.Width)
this.Width += pnlMeter.Height - pnlMeter.Width;
else
this.Height += pnlMeter.Width - pnlMeter.Height;
}
DrawBackGroundImage();
}
#endregion
#region 相关属性设置
private float fltMaxData = 55.5F;
/// <summary>
/// 仪表度数最大值
/// </summary>
public float My_MeterData
{
get { return fltMaxData; }
set
{
fltMaxData = value;
DrawBackGroundImage();
}
}
private string strMeterSingle = "PPT";
/// <summary>
/// 仪表标志
/// </summary>
public string My_MeterSingle
{
get { return strMeterSingle; }
set { strMeterSingle = value; }
}
private float fltRealTimeData = 0F;
/// <summary>
/// 实时数据
/// </summary>
public float My_RealTimeData
{
get { return fltRealTimeData; }
set
{
fltRealTimeData = value;
SetData(fltRealTimeData.ToString());
//DrawMeterIndex();
Invalidate();
}
}
private string strTitle = "";
/// <summary>
/// 控件标题
/// </summary>
public string My_Title
{
get { return strTitle; }
set
{
strTitle = value;
lblTitle.Text = strTitle;
}
}
#endregion
#region 私有变量
private const double dblAngleRadianModulus = 3.14159265358 / 180;
private PointF[] ptfSingle = new PointF[11];
private PointF ptff = new PointF(0, 0);
private delegate void SetRealTimeData(string strRealTimeData);
private delegate Point SetPoint(Point pt);
private delegate void SetImageToPic(Image img1);//委托方法
//private bool isInvilidate = false;
#endregion
#region 私有方法
#region 画背景图片
private void DrawBackGroundImage()
{
try
{
ptff = new PointF(pnlMeter.Width / 2F, pnlMeter.Width / 2F);
PointF ptf = new PointF();
//pnlMeter.BackgroundImage = null;
Image img = new Bitmap(pnlMeter.Width, pnlMeter.Height);
//using (Graphics g = Graphics.FromImage(img))
using (Graphics g = pnlMeter.CreateGraphics())
{
lock (g)
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.FillEllipse(Brushes.White, new Rectangle(0, 0, pnlMeter.Height, pnlMeter.Height));
g.DrawEllipse(new Pen(Brushes.Black), new RectangleF(pnlMeter.Height / 2F - 8, pnlMeter.Height / 2F - 8, 16F, 16F));
g.FillEllipse(Brushes.Black, new RectangleF(pnlMeter.Height / 2F - 8, pnlMeter.Height / 2F - 8, 16F, 16F));
double dblInceptAngle = 210; //起始角度
for (int i = 1; i < 101; i++)
{
if (i == 1)//画长刻度
{
PointF ptx = new PointF(pnlMeter.Width / 2F - (pnlMeter.Height - 20) / 2F * (float)Math.Sin((dblInceptAngle + i * 3) * dblAngleRadianModulus), pnlMeter.Width / 2F - (pnlMeter.Height - 20) / 2F * (float)Math.Cos((dblInceptAngle + i * 3) * dblAngleRadianModulus));
PointF pty = new PointF(pnlM