.net绘制实时曲线之直方图

这个.NET示例展示了如何创建一个用户控件用于绘制实时曲线,特别关注直方图的绘制。控件允许设置直方图的名称、设计值、实际值、颜色等属性,并根据设定实时更新柱状图的高度。用户可以定制防沙模式或酸化模式来展示实际值与设计值的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值