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 } }
.NET画实时直方图
最新推荐文章于 2021-09-06 10:06:06 发布