winfrom 折线图功能封装

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace MySerial
{
    public partial class FormChart : Form
    {
        private List<Chart> charts;

        private Queue<int> pmDataQueue1 = new Queue<int>(100);
        private Queue<int> pmDataQueue2 = new Queue<int>(100);
        private Queue<int> pmDataQueue3 = new Queue<int>(100);

        private List<Queue<int>> pmDataQueues;

        public FormChart()
        {
            InitializeComponent();
        }

        private void Setting_MyChartUI_YMaxMin(int max, int min, Chart thischart)
        {
            thischart.ChartAreas[0].AxisY.Maximum = max * 1.09;
            //thischart.ChartAreas[0].AxisY.Minimum = min * 0.91;
            thischart.ChartAreas[0].AxisY.Minimum = 0;
        }

        private void Setting_MyChart_MakingLine(int lineMax, Chart thisChart)
        {
            #region 添加标识线
            StripLine stripLine = new StripLine();
            stripLine.Text = lineMax.ToString();//展示文本
            stripLine.BackColor = Color.Red;//背景色
            stripLine.Interval = 0;//间隔
            stripLine.IntervalOffset = lineMax;//偏移量
            stripLine.StripWidth = 0.003;//线宽
            stripLine.ForeColor = Color.White;//前景色
            stripLine.TextAlignment = StringAlignment.Near;//文本对齐方式
            thisChart.ChartAreas[0].AxisY.StripLines.Add(stripLine);
            #endregion
        }



        private void Setting_MyChartUI(Chart thisChart)
        {
            #region 图表内部颜色
            thisChart.ChartAreas[0].BackColor = Color.FromArgb(33, 99, 106);
            #endregion

            #region x,y轴字体设置
            thisChart.ChartAreas[0].AxisY.LabelStyle.ForeColor = Color.FromArgb(205, 255, 255);
            thisChart.ChartAreas[0].AxisX.LabelStyle.Font = new Font("思源黑体 CN Bold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            #endregion

            #region 折线图横线颜色
            thisChart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.FromArgb(205, 255, 255);
            #endregion

            #region 坐标轴箭头样式
            thisChart.ChartAreas[0].AxisX.ArrowStyle = AxisArrowStyle.Triangle;
            thisChart.ChartAreas[0].AxisY.ArrowStyle = AxisArrowStyle.Triangle;
            #endregion

            #region 坐标轴颜色
            thisChart.ChartAreas[0].AxisX.LineColor = Color.White;
            thisChart.ChartAreas[0].AxisY.LineColor = Color.White;
            #endregion

            #region x轴相邻间隔大小
            thisChart.ChartAreas[0].AxisX.Interval = 1;
            #endregion

            #region 线条的颜色
            thisChart.Series[0].Color = Color.FromArgb(100, 46, 199, 201);
            #endregion

            #region 点上的颜色
            thisChart.Series[0].MarkerColor = Color.Purple;
            #endregion

            #region 每一个点上数字的颜色
            thisChart.Series[0].LabelForeColor = Color.FromArgb(255, 179, 102);
            #endregion

            #region 在点上显示数字
            thisChart.Series[0].IsValueShownAsLabel = true;
            #endregion

            #region 点上的图案
            thisChart.Series[0].MarkerStyle = MarkerStyle.Diamond;
            #endregion

            #region 包含范围的折线图类型 范围内和线条的颜色一致
            thisChart.Series[0].ChartType = SeriesChartType.SplineRange;
            #endregion
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            PMdata pMdata = PMdata.GetInstance();

            for (int i = 0; i < charts.Count(); i++)
            {
                Setting_MyChartUI(charts[i]);
            }

            for (int i = 0; i < charts.Count(); i++)
            {
                charts[i].ChartAreas[0].AxisY.StripLines.Clear();//清除上一根线

                Setting_MyChartUI_YMaxMin(pMdata.pmMax[i], 0, charts[i]);
                Setting_MyChart_MakingLine(pMdata.pmMax[i], charts[i]);
            }

            for (int i = 0; i < charts.Count(); i++)
            {
                if (pmDataQueues[i].Count() < 10)
                {
                    pmDataQueues[i].Enqueue(int.Parse(pMdata.pmDic[pMdata.pmType[i]]));
                }
                else
                {
                    pmDataQueues[i].Dequeue();
                }
            }

            #region 折线图刷新
            for (int i = 0; i < charts.Count(); i++)
            {
                charts[i].Series[0].Points.Clear();
            }
            #endregion

            #region 折线图数据刷新
            for (int i = 0; i < charts.Count(); i++)
            {
                for (int j = 0; j < pmDataQueues[i].Count(); j++)
                {
                    charts[i].Series[0].Points.AddXY(j + 2, pmDataQueues[i].ElementAt(j));

                    if (PointIsOk(pmDataQueues[i].ElementAt(j),i))
                    {
                        charts[i].Series[0].Color = Color.FromArgb(100, 46, 199, 201);
                    }
                    else
                    {
                        charts[i].Series[0].Color = Color.FromArgb(100, 252, 86, 51); ;
                    }
                }
            }
            #endregion

            #region 关闭X轴名称
            for (int i = 0; i < charts.Count(); i++)
            {
                charts[i].ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
            }
            #endregion
        }

        private bool PointIsOk(int value,int i)
        {
            PMdata pMdata = PMdata.GetInstance();

            bool isMValueOK = (value < pMdata.pmMax[i]);
            if (isMValueOK)
            {
                return true;
            }

            return false;

        }

        private void FormChart_Load(object sender, EventArgs e)
        {
            charts = new List<Chart> { chart1, chart2, chart3 };

            pmDataQueues = new List<Queue<int>>(10) { pmDataQueue1, pmDataQueue2, pmDataQueue3 };

            timer1.Enabled = true;
            this.TopMost = true;

        }
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ou.cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值