首页 > 编程语言 >C# Chart折线图使用鼠标滚轮放大、缩小和平移曲线方式

C# Chart折线图使用鼠标滚轮放大、缩小和平移曲线方式

时间:2024-08-01 11:21:31浏览次数:8  
标签:滚轮 false 鼠标 C# 曲线 Chart chart1 ChartAreas 折线图

使用鼠标滚轮滚动放大和缩小X轴的宽度,鼠标左键按住拖动实现曲线的左右平移,不再使用滚动条。

添加鼠标滚轮事件

在chart控件自带的鼠标事件中并没有鼠标的滚轮事件,因此需要手动添加一下,在窗体的Designer.cs文件下的InitializeComponent()函数中添加如下代码

this.chart1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.chart1_MouseWheel);

实现鼠标滚轮事件

private void chart1_MouseWheel(object sender, MouseEventArgs e)
{
	// 实验发现鼠标滚轮滚动一圈时e.Delta = 120,正反转对应正负120
	if (chart1.ChartAreas[0].AxisX.ScaleView.Size > 0) // 防止越过左边界
	{
		chart1.ChartAreas[0].AxisX.ScaleView.Size += (e.Delta / 120); // 每次缩放1
	}
	else if(e.Delta > 0)
	{
		chart1.ChartAreas[0].AxisX.ScaleView.Size += (e.Delta / 120); // 每次缩放1
	}           
}     

上述方法即可实现鼠标滚轮滚动完成曲线的缩放功能,下面实现鼠标按键按住左右拖动实现曲线的左右平移。

初始化有关参数

// 定义两个全局变量
public bool isMouseDown = false;
public int lastMove = 0; // 用于记录鼠标上次移动的点,用于判断是左移还是右移
// 初始化ScaleView,可根据首次出现在chart中的数据点数修改合适的值
chart1.ChartAreas[0].AxisX.ScaleView.Size = 5;
// 设置不显示chart自带的滚动条
chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = false;
chart1.ChartAreas[0].AxisY.ScrollBar.Enabled = false;
// 注意不要开启X轴游标,默认不开启,如下设置false或者不设置下列参数
chart1.ChartAreas[0].CursorX.IsUserEnabled = false;
chart1.ChartAreas[0].CursorX.AutoScroll = false;
chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = false;

添加鼠标按下、弹起和移动事件

// 鼠标按下事件
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
	lastMove  = 0;
    isMouseDown = true;
}
// 鼠标弹起事件
private void chart1_MouseUp(object sender, MouseEventArgs e)
{
    isMouseDown = false;
}
// 鼠标移动事件
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    if (isMouseDown)
    {
    	// 可更改(交换)如下加减1或if条件来设置鼠标移动时曲线移动方向
        if(lastMove != 0 && e.X - lastMove > 0)
            chart1.ChartAreas[0].AxisX.ScaleView.Position += 1;  // 每次移动1
        else if(lastMove != 0 && e.X - lastMove < 0)
            chart1.ChartAreas[0].AxisX.ScaleView.Position -= 1; // 每次移动1
        lastMove = e.X;
    }
}

最终效果如下,图片前面黑呼呼的为控制台输出,,可观察到鼠标滚轮的变化。

如何使用Chart图表

效果图

我们首先要加载Chart控件

 

 

 

 

 

然后打开控件的属性窗口

在这个窗口里面我们可以修改曲线的名称,名称在【数据》Name】里面修改

讲一下属性窗口里面我们用到的几个选项的作用吧

数据

XValueType是X轴的数据类型,Y同理,这里我们选Time,可以随时间改变

图表

ChartType是图表的类型,我们可以选出我们想要用的类型,这里选曲线

外观

Color可以选择曲线的颜色,这里我选了红色

左边的成员 框,是我们要显示的曲线,可以添加多个

其他属性如果有需要自行修改,修改好之后确定,回到窗口设计界面

在工具箱添加Timer

在Timer的事件窗口双击时钟事件

代码如下,请自行对照填到对应的事件里面去

public partial class Form1 : Form
    {
        int cnt = 0;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            chart1.Series[0].Points.AddY(cnt*cnt);
            label1.Text = cnt.ToString();
            cnt++;
        }
 
        private void chart1_Click(object sender, EventArgs e)
        {
 
        }
    }

cnt是个自变量,曲线显示的是cnt为底的2次指数曲线

 

标签:滚轮,false,鼠标,C#,曲线,Chart,chart1,ChartAreas,折线图
From: https://www.cnblogs.com/dzjl/p/18336254

相关文章

  • [BSidesCF 2020]Had a bad day
    [BSidesCF2020]Hadabadday参考:文件包含漏洞Step点一下按钮,发现URL发生改变:url/index.php?category=woofers修改尝试发现回显:​Sorry,wecurrentlyonlysupportwoofersandmeowers.继续尝试修改:url/index.php?category=woofers.php;flag回显:Warn......
  • vue若依集成C#的singalR接收实时数据
    要写一个实时监控页面,监控堆垛机实时状态以及线体上是否有载具、是否有任务、是否有告警。项目是若依前端,后端是Java接口。要跳过Java接口,直接对接C#的signalR推送数据。需要配置两个总接口地址,原先的Java总接口地址不能删。这里的signalR是Microsoft的sigalR,开始还搞错了,搞成了另......
  • 三种语言实现双指针解决数组元素的目标和(C++/Python/Java)
    题目给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i]+B[j]=x的数对(i,j)。数据保证有唯一解。输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。第二行包含n个整数,表示数组A。第三行包含m个整数......
  • 升华Scrum
    Scrum通常在团队层面实施,这可能会限制在更大规模上实现业务敏捷。为了突破这一瓶颈,我们需要从‘团队级敏捷’迈向更加综合的协作模式,这顺应了‘敏捷转型的深化’趋势。我们需要采取更加全面的策略,促进团队内部和跨团队的协作,与“敏捷开发的第二波浪潮”保持一致。敏捷开发的第......
  • 【Dash】Dash链接 csv/excel 文件
    一、Dash如何连接csv数据?Thereareamanywaystoadddatatoanapp:APIs,externaldatabases,local.txt files,JSONfiles,andmore.Inthisexample,wewillhighlightoneofthemostcommonwaysofincorporatingdatafromaCSVsheet.#Importpackages......
  • cookie--SameSite说明
    Cookie是一种可用于向网站添加持久状态的方法。多年来,虽然cookie的功能得到了不断的进步和发展,但却给平台留下了一些遗留问题。为了解决这些问题,浏览器(包括Chrome、Firefox和Edge)正在改变行为,从而强制执行更多保护隐私的默认设置。什么是第一方和第三方cookie?与当前网站......
  • 服务器LSI9361 RAID卡更换为BCM9560 RAID卡重启系统蓝屏解决方法
    一、问题现象服务器配LSI9361RAID卡,安装的系统为WindowsServer2022、2019、2016时。当LSI9361RAID卡故障后,使用BCM9560RAID卡替代后,无法进入系统后。报错提示如下图:二、解决方法 2.1 WindowsServer2022系统1、服务器启动时按F8键,选择“安全模式”进入系统。2......
  • NVIDIA GPU MIG多实例&Multi-Instance GPU-中文用户指南
    目录第一章、介绍第二章、支持的GPU卡第三章、支持的配置 第四章、虚拟化 第五章、概念 5.1术语5.2 分区(Partitioning) 5.3 CUDA并发机制第六章、部署考虑事项6.2 应用考虑事项 第七章、MIG设备名称7.1  设备枚举7.2 CUDA设备枚举第八章、支持的MIG......
  • 甲骨文云 (Oracle Cloud) 开启IPV6
    VCN处理1、给VCN附加IPV6​​​​​​‍2、VCN路由表添加路由​​​​​​‍子网处理3、给子网附加IPV6​​4、子网ACL添加放行IPV6防火墙规则实例会受到到子网ACL和实例安全组ACL的双重控制,所以子网这里可以放行大些。具体限制在实例安全组进行控制。​​......
  • C++对象析构顺序问题——由QObject::desroyed展开的思考
    C++对象析构顺序问题——由QObject::desroyed展开的思考C++析构函数执行的顺序是最先执行继承链最末端的子类的,最后执行顶层的基类的。而QObject::destroyed(QObject*obj=nullptr)信号在Qt文档中说是“在obj被完全析构时之前立即触发,并且不会被阻塞”。这里的“完全析......