C# chart绘图 鼠标响应

news2024/11/15 13:59:24

1、图形自动滚动设置

chart1.ChartAreas[0].AxisX.Maximum 横坐标显示区域最大值

chart1.ChartAreas[0].AxisX.Minimum 横坐标显示区域最小值

显示宽度 = chart1.ChartAreas[0].AxisX.Maximum - chart1.ChartAreas[0].AxisX.Minimum

            chart1.ChartAreas[0].AxisX.Maximum = x_data;
            if (x_data > AaxisXScrollNum)
            {
                chart1.ChartAreas[0].AxisX.Minimum = x_data - AaxisXScrollNum;
            }
            else
            {
                chart1.ChartAreas[0].AxisX.Minimum = 0;
            }

2、图形移动

chart1.ChartAreas[0].AxisX.ScaleView.Position   X轴相对于起始点被移动的距离

chart1.ChartAreas[0].AxisY.ScaleView.Position   Y轴相对于起始点被移动的距离

3、图表缩放

chart1.ChartAreas[0].AxisX.ScaleView.Size  X轴在原基础上的缩放比列

chart1.ChartAreas[0].AxisX.ScaleView.Size Y轴在原基础上的缩放比列

4、坐标轴显示格式

chart1.ChartAreas[0].AxisX.LabelStyle.Format = "N1";  //限制X轴标签显示浮点数一位小数
chart1.ChartAreas[0].AxisY.LabelStyle.Format = "N1"; //限制Y轴标签显示浮点数一位小数

5、显示效果

代码上一波,方便以后复制

 
        /// <summary>
        /// 图标数据刷新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            x_data += 1;
            double y = Math.Sin(x_data * Math.PI / 180.0);

            chart1.ChartAreas[0].AxisX.Maximum = x_data;
            if (x_data > AaxisXScrollNum)  //调整显示区域跟随
            {
                chart1.ChartAreas[0].AxisX.Minimum = x_data - AaxisXScrollNum;
            }
            else
            {
                chart1.ChartAreas[0].AxisX.Minimum = 0;
            }
            chart1.Series[0].Points.AddXY(x_data, y);
        }

        double x_data = 0;
        private void button4_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 360 * 2; i++)
            {
                x_data += 1;
                double y = Math.Sin(i * Math.PI / 180.0);
                chart1.Series[0].Points.AddXY(x_data, y);

            }
        }

        public bool isMouseDown = false;
        public int lastMove = 0; // 用于记录鼠标上次移动的点,用于判断是左移还是右移

 
        double mouseDownPosX, mouseRateX;
        int mouseDownXoldX, mouseDownxNewX;

        double mouseDownPosY, mouseRateY;
        int mouseDownXoldY, mouseDownxNewY;

        #region 鼠标移动效果
        private void chart1_MouseUp(object sender, MouseEventArgs e)
        {
            IsMoveChart = false;

        }
        bool IsMoveChart;
        private void chart1_MouseDown(object sender, MouseEventArgs e)
        {
            //  if (checkBox1.Checked)
            {
                mouseDownPosX = chart1.ChartAreas[0].AxisX.ScaleView.Position;
                mouseDownXoldX = e.X;
                mouseRateX = chart1.ChartAreas[0].AxisX.PixelPositionToValue(2) - chart1.ChartAreas[0].AxisX.PixelPositionToValue(1);
                IsMoveChart = true;
            }

            //   if (checkBox2.Checked)
            {
                mouseDownPosY = chart1.ChartAreas[0].AxisY.ScaleView.Position;
                mouseDownXoldY = e.Y;
                mouseRateY = chart1.ChartAreas[0].AxisY.PixelPositionToValue(2) - chart1.ChartAreas[0].AxisY.PixelPositionToValue(1);
                IsMoveChart = true;
            }

        }
        /// <summary>
        /// 精确随鼠标移动
        /// </summary>
        private void chart1_MouseMove(object sender, MouseEventArgs e)
        {
            if (IsMoveChart)
            {
                //  if (checkBox1.Checked)
                {
                    mouseDownxNewX = e.X;
                    chart1.ChartAreas[0].AxisX.ScaleView.Position = mouseDownPosX + (mouseDownXoldX - mouseDownxNewX) * mouseRateX;
                }

                //    if (checkBox2.Checked)
                {
                    mouseDownxNewY = e.Y;
                    chart1.ChartAreas[0].AxisY.ScaleView.Position = mouseDownPosY + (mouseDownXoldY - mouseDownxNewY) * mouseRateY;

                }

                Text = "SCA:" + chart1.ChartAreas[0].AxisX.ScaleView.Size + " " + chart1.ChartAreas[0].AxisY.ScaleView.Size + "   POS:" + chart1.ChartAreas[0].AxisX.ScaleView.Position + " " + chart1.ChartAreas[0].AxisY.ScaleView.Position;

            }
        }

        #endregion

        #region 鼠标缩放效果

        /// <summary>
        /// 以鼠标中心缩放大小
        /// </summary>
        private void ResetPosVal(MouseEventArgs e)
        {
            if (checkBox3.Checked)
            {
                double newSizeXz = 0;//     
                if (e.Delta < 0) //设定放大或者缩小范围
                {
                    newSizeXz = chart1.ChartAreas[0].AxisX.ScaleView.Size * 1.2f;
                }
                else
                {
                    newSizeXz = chart1.ChartAreas[0].AxisX.ScaleView.Size * 0.8f;
                }
                if (newSizeXz > 0)
                {
                    double xMouseNew;
                    double xMouseOld = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
                    chart1.ChartAreas[0].AxisX.ScaleView.Size = newSizeXz;
                    xMouseNew = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
                    double newPosition = xMouseOld - xMouseNew;
                    chart1.ChartAreas[0].AxisX.ScaleView.Position += Math.Round(newPosition, 3);
                }
            }

            if (checkBox4.Checked)
            {

                double newSizeYz = 0;//     
                if (e.Delta < 0) //设定放大或者缩小范围
                {
                    newSizeYz = chart1.ChartAreas[0].AxisY.ScaleView.Size * 1.2f;
                }
                else
                {
                    newSizeYz = chart1.ChartAreas[0].AxisY.ScaleView.Size * 0.8f;
                }
                if (newSizeYz > 0)
                {
                    double xMouseNew;
                    double xMouseOld = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
                    chart1.ChartAreas[0].AxisY.ScaleView.Size = newSizeYz;
                    xMouseNew = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
                    double newPosition = xMouseOld - xMouseNew;
                    chart1.ChartAreas[0].AxisY.ScaleView.Position += Math.Round(newPosition, 3);
                }
            }

            Text = "SCA:" + chart1.ChartAreas[0].AxisX.ScaleView.Size + " " + chart1.ChartAreas[0].AxisY.ScaleView.Size + "   POS:" + chart1.ChartAreas[0].AxisX.ScaleView.Position + " " + chart1.ChartAreas[0].AxisY.ScaleView.Position;

        }

        #endregion


        /// <summary>
        /// 恢复缩放位置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button7_Click(object sender, EventArgs e)
        {

            chart1.ChartAreas[0].AxisX.ScaleView.ZoomReset(0);
            chart1.ChartAreas[0].AxisY.ScaleView.ZoomReset(0);

            Text = "SCA:" + chart1.ChartAreas[0].AxisX.ScaleView.Size + " " + chart1.ChartAreas[0].AxisY.ScaleView.Size + "   POS:" + chart1.ChartAreas[0].AxisX.ScaleView.Position + " " + chart1.ChartAreas[0].AxisY.ScaleView.Position;

            timer1.Start();

        }

        /// <summary>
        /// 鼠标移动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chart1_MouseWheel(object sender, MouseEventArgs e)
        {
            ResetPosVal(e);
        }

        /// <summary>
        /// 停止数据更新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button8_Click(object sender, EventArgs e)
        {

            timer1.Stop();
 
            // 设置不显示chart自带的滚动条
            chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = false;
            chart1.ChartAreas[0].AxisY.ScrollBar.Enabled = false;

            chart1.ChartAreas[0].AxisY.ScaleView.Size = chart1.ChartAreas[0].AxisY.ScaleView.ViewMaximum - chart1.ChartAreas[0].AxisY.ScaleView.ViewMinimum;
            chart1.ChartAreas[0].AxisX.ScaleView.Size = chart1.ChartAreas[0].AxisX.ScaleView.ViewMaximum - chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum;


            Text = "SCA:" + chart1.ChartAreas[0].AxisX.ScaleView.Size + " " + chart1.ChartAreas[0].AxisY.ScaleView.Size + "POS:" + chart1.ChartAreas[0].AxisX.ScaleView.Position + " " + chart1.ChartAreas[0].AxisY.ScaleView.Position;


        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT从业影响之个人浅见

文章目录前言ChatGPT简介AI简介ChatGPT对从业者的影响参考资料前言 ChatGRT最近很火&#xff0c;网上有一些观点&#xff0c;他会取代很多职业&#xff0c;让产业产生颠覆性的变化。今天聊聊自己的想法&#xff0c;他的出现&#xff0c;是否会让我&#xff08;程序员&#xff…

qmt api 接口文档

http://qmt.ptradeapi.com 用户自行安装 Python 三方库 对于有经验的 Python 开发者来说&#xff0c;平台提供了自行安装第三方库的方式。为了引入额外的第三方库&#xff0c;用户需要做如下一些操作&#xff1a; 安装前注意事项&#xff1a; 三方库的安装有可能会引起系统错误…

JVM学习篇对象创建与内存分配机制深度剖析

1. 对象的创建 对象创建的主要流程: 1.1 类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相…

【Java 面试合集】内存中为什么要区分栈和堆

内存中为什么要区分栈和堆 1. 概述 嗨&#xff0c;大家好Java 面试合集又来了&#xff0c;今天我们分享的主题很大众化以及普通。无论是Java 语言本身还是别的语言都会有所涉及&#xff0c;但是今天我们从Java角度来讲下 2. 分析 今天我们会从多个方向来分享这个话题 2.1 栈是…

ETCD本地多成员集群部署

目录安装部署etcdctl 操作etcd使用http请求操作etcd本地多成员集群搭建python获取成员信息参考安装部署 按照官网文档&#xff0c;安装release版本 https://etcd.io/docs/v3.4/install/ [rootVM-33-162-centos /usr/local/bin]# etcd --version etcd Version: 3.4.16 Git SH…

点云配准方法原理(NDT、ICP)

配准是点云处理中的一个基础问题&#xff0c;众多学者此问题进行了广泛而深入的研究&#xff0c;也出现了一系列优秀成熟的算法&#xff0c;在三维建模、自动驾驶等领域发挥着重要的作用。 本文主要介绍粗配准NDT (Normal Distribution Transform) 与 精配准ICP (Iterative Cl…

最新最全中小微企业研究数据:海量创业公司信息与获取投资信息(1985-2021年)

一、企业获取投资名单&资方信息 数据来源&#xff1a;搜企网、企查查、天眼查 时间跨度&#xff1a;1985年8月-2021年9月 区域范围&#xff1a;全国范围 数据字段&#xff1a;企业名称、时间、获得投资金额以及投资方信息 部分数据&#xff1a; DateCompany_nameUnit…

摄影师没了?!生成式人工智能即将降维打击摄影行业

本文是Mixlab无界社区成员的投稿&#xff1a;滚石deepfacelab和deepfacelive项目组成员摄影师失业了&#xff1f;&#xff1f;怎么说&#xff1f;##你还以为AI绘画影响的只是插画师行业吗&#xff1f;错了&#xff0c;摄影行业也即将面临技术洗牌。话不多说&#xff0c;先看一下…

java并发编程原理2 (AQS, ReentrantLock,线程池)

一、AQS&#xff1a; 1.1 AQS是什么&#xff1f; AQS就是一个抽象队列同步器&#xff0c;abstract queued sychronizer&#xff0c;本质就是一个抽象类。 AQS中有一个核心属性state&#xff0c;其次还有一个双向链表以及一个单项链表。 首先state是基于volatile修饰&#x…

分享113个HTML艺术时尚模板,总有一款适合您

分享113个HTML艺术时尚模板&#xff0c;总有一款适合您 113个HTML艺术时尚模板下载链接&#xff1a;https://pan.baidu.com/s/1ReoPNIRjkYov-SjsPo0vhg?pwdjk4a 提取码&#xff1a;jk4a Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 女性化妆用品网页模板 粉…

【Linux】用户分类+权限管理+umask+粘滞位说明

目录 1.用户分类 su指令 2.认识Linux权限 2.1 文件访问者的分类 2.2 文件类型和访问权限 a. 文件类型 file指令 b. 访问权限 2.3 文件权值的表示方法 a. 字母表示法 b. 八进制表示法 3.如何修改文件访问者的权限及相关指令 1. chmod指令 2. chown指令 3. chgrp指…

Python语言零基础入门教程(二十七)

Python OS 文件/目录方法 Python语言零基础入门教程&#xff08;二十六&#xff09; 61、Python os.utime() 方法 概述 os.utime() 方法用于设置指定路径文件最后的修改和访问时间。 在Unix&#xff0c;Windows中有效。 语法 utime()方法语法格式如下&#xff1a; os.uti…

SortableJS/Sortable拖拽组件,使用详细(Sortablejs安装使用)

简述 作为一名前端开发人员&#xff0c;在工作中难免会遇到拖拽功能&#xff0c;分享一个github上一个不错的拖拽js库&#xff0c;能满足我们在项目开发中的需要&#xff0c;支持Vue和React&#xff0c;下面是SortableJS的使用详细&#xff1b; 这个是sortableJS中文官方文档&…

kafka-6-python单线程操作kafka

使用Python操作Kafka&#xff1a;KafkaProducer、KafkaConsumer Python kafka-python API的帮助文档 1 kafka tools连接 (1)/usr/local/kafka_2.13-3.4.0/config/server.properties listeners PLAINTEXT://myubuntu:9092 advertised.listenersPLAINTEXT://192.168.1.8:2909…

MotoSimEG-VRC教程:动态输送带创建以及示教编程与仿真运行

目录 任务描述 简易输送带外部设备创建 输送带模型添加与配置 工件安装到输送带 输送带输送工件程序编写与仿真运行 任务描述 在MotoSimEG-VRC中创建1条输送带&#xff0c;并且能够实现将工件从输送带起始点位置处输送到结束点位置处。 简易输送带外部设备创建 在MotoS…

Linux系统之终端管理命令的基本使用

Linux系统之终端管理命令的基本使用一、检查本地系统环境1.检查系统版本2.检查系统内核版本二、终端介绍1.终端简介2.Linux终端简介3.终端的发展三、终端的相关术语1.终端模拟器2.tty终端3.pts终端4.pty终端5.控制台终端四、终端管理命令ps1.直接使用ps命令2.列出登录详细信息五…

RPA落地指南:什么是RPA

什么是RPA RPA在企业中起什么作用并扮演什么角色呢&#xff1f;想要充分了解RPA&#xff0c;我们需要知道RPA的相关概念、特点、功能以及能解决的问题。接下来对这些内容进行详细介绍。 1.1 RPA的3个核心概念 RPA的中文译名是“机器人流程自动化”&#xff0c;顾名思义&…

初始C语言 - 数组(一维数组、二维数组、数组越界、数组传参)

目录 一、一维数组的创建和初始化 1、数组的创建 2、 数组的初始化 3.一维数组的使用 数组通过下标来访问 总结: 1. 数组是使用下标来访问的&#xff0c;下标是从0开始。 2. 数组的大小可以通过计算得到。 4、一维数组在内存中的存储 二、 二维数组的创建和初始化 1.二…

算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘

这里写自定义目录标题分治法概述特点大数相乘问题分治算法矩阵相乘分治算法残缺棋盘分治算法分治法概述 在分而治之的方法中&#xff0c;一个问题被划分为较小的问题&#xff0c;然后较小的问题被独立地解决&#xff0c;最后较小问题的解决方案被组合成一个大问题的解决。 通常…

【软件测试】自动化测试工程师必会的单元测试编写(总结),你真的了解吗......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 单元测试编写的目的…