using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace DrawChart
{
public partial class DrawChart : UserControl
{
#region 构造函数
public DrawChart()
{
InitializeComponent();
DrawBackGround();
}
#endregion
#region 相关属性设置
private string strTitleName = "";
/// <summary>
/// 设置直方图名称
/// </summary>
[Bindable(true), Category("基础信息属性设置"), DefaultValue(""), Description("设置直方图名称")]
public string My_TitleName
{
get { return strTitleName; }
set
{
strTitleName = value;
lblTitle.Text = strTitleName;
}
}
private int colorDesign = 0;
/// <summary>
/// 设置设计直方图背景色
/// </summary>
[Bindable(true), Category("基础信息属性设置"), DefaultValue(""), Description("设置静态设计直方图背景色")]
public int My_DesignColor
{
get { return colorDesign; }
set
{
colorDesign = value;
DrawBackGround();
}
}
private int colorActual = 0;
/// <summary>
/// 绘图颜色
/// </summary>
[Bindable(true), Category("基础信息属性设置"), DefaultValue(""), Description("设置实际作图直方图背景色")]
public int My_ActualColor
{
get { return colorActual; }
set
{
colorActual = value;
}
}
private bool bolUp = true;
/// <summary>
/// 绘制直方图模式 true 防沙模式;false 酸化模式
/// </summary>
[Bindable(true), Category("基础信息属性设置"), DefaultValue(""), Description("绘制直方图模式 true 防沙模式;false 酸化模式")]
public bool My_DrawChartWithUp
{
get { return bolUp; }
set
{
bolUp = value;
}
}
#endregion
#region 作图属性
private float fltDesignData = 0F;
/// <summary>
/// 设置设计值
/// </summary>
[Bindable(true), Category("作图属性"), DefaultValue(""), Description("设置设计值")]
public float My_DesignData
{
get { return fltDesignData; }
set
{
fltDesignData = value;
lblDesign.Text = "设计:"+fltDesignData.ToString();
}
}
private float fltActualData = 0F;
/// <summary>
/// 设置实际值
/// </summary>
[Bindable(true), Category("作图属性"), DefaultValue(""), Description("设置实际值")]
public float My_ActualData
{
get { return fltActualData; }
set
{
fltActualData = value;
if (bolUp)
{
SetRealTimeData(fltActualData.ToString());
DrawRealTimeChart(GetRectF(fltActualData));
}
else
{
if (fltActualData < fltDesignData)
{
SetRealTimeData(Convert.ToString((fltDesignData - fltActualData)));
DrawRealTimeChart(GetRectF(fltDesignData - fltActualData));
}
else
{
SetRealTimeData("0");
}
}
}
}
#endregion
#region 私有变量
private Color colorFrame = Color.Cyan;//边框颜色 默认
private delegate void SetImageToPnl(Image img1);//委托方法
private delegate void SetRealData(string strRealTimeData);//设置实时数据
#endregion
#region 私有方法
#region 初始化背景图片
private void DrawBackGround()
{
Image img = new Bitmap(pnlChart.Width, pnlChart.Height);
using (Graphics g =Graphics.FromImage(img))
{
//画矩形
g.DrawRectangle(new Pen(Brushes.Cyan,1.9F), new Rectangle(2, 2, (pnlChart.Width - 4) / 2, pnlChart.Height - 6));
//填充矩形
SolidBrush bh = new SolidBrush(ColorTranslator.FromOle(colorDesign));
g.FillRectangle(bh, new Rectangle(3, 3, (pnlChart.Width - 4) / 2 - 2, pnlChart.Height - 7));
//画边框
g.DrawLine(new Pen(Brushes.Cyan, 1.9F), new Point((pnlChart.Width - 4) / 2 + 2, pnlChart.Height - 4), new Point(pnlChart.Width - 4, pnlChart.Height - 4));
g.Dispose();
}
SetBackGroundImage(img);
}
#endregion
#region 重绘
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
DrawRealTimeChart(GetRectF(fltActualData));
}
#endregion
#region 实时绘制柱状图
private void DrawRealTimeChart(RectangleF rtf)
{
try
{
using (Graphics g = pnlChart.CreateGraphics())
{
SolidBrush bh = new SolidBrush(ColorTranslator.FromOle(colorActual));
SolidBrush bhWithe = new SolidBrush(Color.White);
g.FillRectangle(bhWithe, new RectangleF((float)(pnlChart.Width - 4) / 2 + 2, 4, (float)(pnlChart.Width - 4) / 2, (float)(pnlChart.Height - 8)));
g.FillRectangle(bh, rtf);
g.Dispose();
}
}
catch
{ }
}
#endregion
#region 计算填充矩形
private RectangleF GetRectF(float fltData)
{
RectangleF rtf = new RectangleF();
float fltTemp = (pnlChart.Height - 8) / fltDesignData;
if (fltActualData <= 0)
{
rtf = new RectangleF(0F, 0F, 0F, 0F);
}
else if (fltActualData > 0 && fltActualData < fltDesignData)
{
rtf = new RectangleF((float)(pnlChart.Width - 4) / 2+2, (float)(pnlChart.Height - 4 - fltData * fltTemp), (float)(pnlChart.Width - 4) / 2-2,fltTemp*fltData-0.8F);
}
else if (fltActualData > fltDesignData)
{
rtf = new RectangleF((float)(pnlChart.Width - 4) / 2+2, 4, (float)(pnlChart.Width - 4) / 2-2, (float)(pnlChart.Height - 8.8F));
}
return rtf;
}
#endregion
#region 托管方法
private void SetBackGroundImage(Image img)
{
if (pnlChart.InvokeRequired)
{
SetImageToPnl stp = new SetImageToPnl(SetBackGroundImage);
Invoke(stp, new object[] { img });
}
else
pnlChart.BackgroundImage = img;
}
private void SetRealTimeData(string str)
{
if (lblActual.InvokeRequired)
{
SetRealData stp = new SetRealData(SetRealTimeData);
Invoke(stp, new object[] { str });
}
else
lblActual.Text = "Actual:"+str;
}
#endregion
#endregion
#region 私有事件 绘图区域Size改变时 触发重绘事件
private void pnlChart_SizeChanged(object sender, EventArgs e)
{
DrawBackGround();
}
#endregion
#region 当绘图区域失去焦点时 触发重绘事件
private void pnlChart_Paint(object sender, PaintEventArgs e)
{
DrawRealTimeChart(GetRectF(fltActualData));
}
#endregion
}
}