C#.net winform的chart控件实现X轴以时间为刻度且随时间变化且可滚轮缩放

示意图

设置X轴以时间为刻度

代码

            //显示格式为时:分:秒
            AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-90).ToOADate(); // 设置X轴最小值和偏移量(这里是当前时间-90秒)  
            AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(10).ToOADate(); // 设置X轴最大值和偏移量(这里是当前时间+10秒)  
            AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴间隔(这里是5秒一个刻度)  
            AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒  
            AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签显示的时间格式
            AzTimeChart.Series[0].SmartLabelStyle.Enabled = true;    // 这里是让标签根据密度转换风格
            AzTimeChart.Series[0].XValueType = ChartValueType.DateTime; // 坐标轴type改为时间

            // 刻度线显示
            AzTimeChart.ChartAreas[0].AxisX.MajorGrid.Enabled = true;
            AzTimeChart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 1;
            AzTimeChart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;

代码的注释写的很清楚了,这里不过多解释

添加节点
AzTimeChart.Series[0].Points.AddXY(DateTime, float);    // 第一个参数直接用DateTime类型的数据就行

X轴随时间变化更新

首先需要在设计界面添加一个Timer控件,属性栏有个闪电图标,点进去就是控件的事件列表,你的Tick旁边应该是空的,双击添加就行

在事件处理函数添加如下代码,实现X轴随时间变化更新


            AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-90).ToOADate(); // 设置X轴最小值和偏移量(这里是当前时间-90秒)  
            AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(10).ToOADate(); // 设置X轴最大值和偏移量(这里是当前时间+10秒)
            AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴刻度间隔  
            AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒 
            AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签格式

emm,这里也应该没问题吧,过

滚轮缩放图表

chart控件并不支持wheel(滚轮)事件,这里我用的是Form的wheel事件进行处理,也可以用panel控件的whell事件进行处理,方法一样,一会再说,先放代码

首先添加事件处理函数


        // 处理鼠标滚轮事件
        private void Form_MouseWheel(object sender, MouseEventArgs e)
        {
            // 检查滚轮方向  
            if (e.Delta > 0)
            {
                // 滚轮向上滚动,放大图表  
                ZoomIn(AzTimeChart.ChartAreas[0].AxisX);
            }
            else
            {
                // 滚轮向下滚动,缩小图表  
                ZoomOut(AzTimeChart.ChartAreas[0].AxisX);
            }
        }
然后在构造函数进行绑定

            // 处理滚轮事件
            this.MouseWheel += new MouseEventHandler(Form_MouseWheel);

接下来就是上滚和下滚的处理函数,这里是根据我的需求做的,你们根据实际情况来就行



        // 滚轮向上滚动,放大图表  
        // 这里其实就是缩小了X轴的范围,间隔不变
        private void ZoomIn(Axis axis)
        {
            if(_ATXMinNum < -10 || _ATXMaxNum > 1)
            {
                // _ATXMinNum和_ATXMaxNum  是定义了类的全局变量记录范围
                // 因为我X轴的正数和负数的比例为9:1,所以每滚动一下它们都按比例减小
                _ATXMinNum = _ATXMinNum - (int)(-10 * 0.9);
                _ATXMaxNum = _ATXMaxNum - (int)(10 * 0.1);

                AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(_ATXMinNum).ToOADate(); // 设置X轴最小值(例如,过去一天)  
                AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(_ATXMaxNum).ToOADate(); // 设置X轴最大值(例如,当前时间)  
                AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴间隔(例如,每天一个刻度)  
                AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒 
                AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签格式
            }
        }

        // 滚轮向下滚动,缩小图表
        // 和上面一样的道理
        private void ZoomOut(Axis axis)
        {
            if (_ATXMinNum > -90 || _ATXMaxNum < 10)
            {
                _ATXMinNum = _ATXMinNum + (int)(-10 * 0.9);
                _ATXMaxNum = _ATXMaxNum + (int)(10 * 0.1);

                AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(_ATXMinNum).ToOADate(); // 设置X轴最小值(例如,过去一天)  
                AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(_ATXMaxNum).ToOADate(); // 设置X轴最大值(例如,当前时间)  
                AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴间隔(例如,每天一个刻度)  
                AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒 
                AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签格式
            }
        }

其实我计时器触发函数那里的最大最小值也用的_ATXMinNum和_ATXMaxNum,这样滚轮事件处理过X轴范围后计时器函数那里也同步上了

再说一下Panel和Form处理Wheel事件的区别,form你想要只在chart范围内响应滚轮事件需要额外添加鼠标当前位置的判断。panel可以直接覆盖在chart区域,这样就不用额外判断位置了

菜鸟一个,有问题欢迎评论区讨论

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值