winform Chart控件 获取鼠标处坐标值方法

WinForm Chart控件获取鼠标坐标值技巧
本文介绍了在WinForm中使用Chart控件时,如何获取鼠标位置处的坐标值。通过调用Chart事件GetToolTip、MouseMove事件结合HitTest方法以及利用GDI+绘制异或线条的方式实现自动光标,探讨了各种方法的优缺点和应用场景。
部署运行你感兴趣的模型镜像

Chart控件本身功能强大,应用广泛,因此其属性、方法也很多。
此处介绍在很多应用中需要查看鼠标位置处坐标值的一些方法

1,调用Chart事件  GetToolTip

利用ToolTipEventArgs ,将ToolTipEventArgs的Text属性赋值即可实现,优点是非常简单,无需其他步骤,但其因为用到HitTest方法,只能获取序列点上的坐标值,不能获得“空白”位置的值

        private void chart_Wave1_GetToolTipText(object sender, ToolTipEventArgs e)
        {
            if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)
            {
                this.Cursor = Cursors.Cross;
                int i = e.HitTestResult.PointIndex;
                DataPoint dp = e.HitTestResult.Series.Points[i];               
                e.Text = string.Format("数值:{1:F3}" + e.HitTestResult.Series.ChartArea + " \n日期:{0}", DateTime.FromOADate(dp.XValue), dp.YValues[0]);
            }
            else
            {
                this.Cursor = Cursors.Default;
            }
        }


2.利用Chart的MouseMove事件和Chart方法 HitTest

特点是可以获取鼠标值,同样因为用到HitTest方法,只能获取序列上序列点处的坐标值,且需要自我实现值的显示

        private void chart_Wave1_MouseMove(object sender, MouseEventArgs e)
        {
           HitTestResult myTestResult=  chart_Wave1.HitTest(e.X,e.Y);
           if (myTestResult.ChartElementType == ChartElementType.DataPoint)
           {
               this.Cursor = Cursors.Cross;
               int i = myTestResult.PointIndex;
               DataPoint dp = myTestResult.Series.Points[i];         
     
              double doubleXValue= (dp.XValue);
              double doubleYValue = dp.YValues[0];   
              //自我实现值的显示          
           }
           else
           {
               this.Cursor = Cursors.Default;
           }
        }

3.利用Chart的MouseMove事件和获取鼠标处坐标实现

根据鼠标位置自动转化为Chart控件ChartArea上的坐标值,再根据序列上(可以看成数组),可以找到每个序列点的坐标值,从而可以确定鼠标所在点在哪两个序列点之间,再利用线性插值或其他插值算法,计算出该点的值。
特点,可以查找序列上任意位置的值,但实现相对复杂。

4.自动光标的实现

引用第三中方法其实只用知道X的位置就可以遍历找出序列上该位置处的Y值,在很多情况下,需要添加自动光
标,自动获取光标与序列焦点处的坐标值。因此还涉及到光标的实现,本人之前也尝试过一些方法,
  • 新添加一条直线序列来代替,在鼠标移动时需要删除之前的“序列光标”再添加新的“序列光标”,不够流畅,效果不理想;
  • 尝试用 GDI绘制一条直线作为光标,需要不能的刷新,效果也不太理想;
  • 最后GDI+异或绘制线条的方式,可以很好的解决这个问题,但仍有一个问题就是,在序列主动刷新(比如显示实时数据波形,2秒钟刷新一次)的时候,容易留下上次的光标痕迹,大家可以试试效果。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值