场景

在使用ZedGraph绘制曲线图时,将鼠标悬浮时内容闪烁,且频率很高。

找到其源码,发现不论鼠标移动的范围大小,甚至乎不论鼠标是否移动,都要刷新一次Tooltip。

注:

博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

首先来到ZedGraph的官网

https://sourceforge.net/projects/zedgraph/

然后点击File下的zedgraph source

选择对应版本,这里是5.1.5

下载成功后,将zip解压

找到source下的工程文件,双击使用VS打开

然后找到ZedGraphControl.Events.cs

找到其ZedGraphControl_MouseMove方法此方法是鼠标移动时的事件处理

可以看到其对两个方法的处理,一个是HandlePointValues,这是对显示线上的点的坐标时的处理,一个是HandleCursorValues这是对获取最近曲线上的点的坐标时的处理。

这样看你的ZedGraph是开启的哪样设置。

假如是设置经过线上点时才显示

zgc.IsShowPointValues = true;

那么就要修改

HandlePointValues( mousePt );

这个方法

首先声明一个类变量

private object lastObj;

用来存储上一次使用的对象,然后找到其判断条件,添加当前是否与上一次是同一对象

然后在最后方法返回时将当前对象赋值给上一次对象。

lastObj = nearestObj;

完整参考代码

private Point HandlePointValues( Point mousePt ){int iPt;GraphPane pane;object nearestObj;using ( Graphics g = this.CreateGraphics() ){if ( _masterPane.FindNearestPaneObject( mousePt,g, out pane, out nearestObj, out iPt ) ){if (nearestObj is CurveItem && iPt >= 0 && !object.Equals(nearestObj, lastObj)){CurveItem curve = (CurveItem)nearestObj;// Provide Callback for User to customize the tooltipsif ( this.PointValueEvent != null ){string label = this.PointValueEvent( this, pane, curve, iPt );if ( label != null && label.Length > 0 ){this.pointToolTip.SetToolTip( this, label );this.pointToolTip.Active = true;}elsethis.pointToolTip.Active = false;}else{if ( curve is PieItem ){this.pointToolTip.SetToolTip( this,( (PieItem)curve ).Value.ToString( _pointValueFormat ) );}//       else if ( curve is OHLCBarItem || curve is JapaneseCandleStickItem )//       {//        StockPt spt = (StockPt)curve.Points[iPt];//        this.pointToolTip.SetToolTip( this, ( (XDate) spt.Date ).ToString( "MM/dd/yyyy" ) + "\nOpen: $" +//        spt.Open.ToString( "N2" ) +//        "\nHigh: $" +//        spt.High.ToString( "N2" ) + "\nLow: $" +//        spt.Low.ToString( "N2" ) + "\nClose: $" +//        spt.Close.ToString//        ( "N2" ) );//       }else{PointPair pt = curve.Points[iPt];if ( pt.Tag is string )this.pointToolTip.SetToolTip( this, (string)pt.Tag );else{double xVal, yVal, lowVal;ValueHandler valueHandler = new ValueHandler( pane, false );if ( ( curve is BarItem || curve is ErrorBarItem || curve is HiLowBarItem )&& pane.BarSettings.Base != BarBase.X )valueHandler.GetValues( curve, iPt, out yVal, out lowVal, out xVal );elsevalueHandler.GetValues( curve, iPt, out xVal, out lowVal, out yVal );string xStr = MakeValueLabel( curve.GetXAxis( pane ), xVal, iPt,curve.IsOverrideOrdinal );string yStr = MakeValueLabel( curve.GetYAxis( pane ), yVal, iPt,curve.IsOverrideOrdinal );this.pointToolTip.SetToolTip( this, "( " + xStr + ", " + yStr + " )" );//this.pointToolTip.SetToolTip( this,// curve.Points[iPt].ToString( this.pointValueFormat ) );}}this.pointToolTip.Active = true;}}elsethis.pointToolTip.Active = false;}elsethis.pointToolTip.Active = false;//g.Dispose();}lastObj = nearestObj;return mousePt;}

具体其他优化与功能修改可自行发掘。

如果在ZedGraph中设置的是显示最近曲线上的点的坐标,即

zgc.IsShowCursorValues = true;

那么就要修改源码的HandleCursorValues方法

同样声明一个类变量存储上次获得的点

private Point lastMovedPoint;

然后在方法中加上判断并通过

this.pointToolTip.AutomaticDelay = 1000;

设置提示延迟1秒。最后再将当前点赋值给类变量。

lastMovedPoint = mousePt;

完整示例代码

private Point HandleCursorValues( Point mousePt ){GraphPane pane = _masterPane.FindPane(mousePt);if (pane != null && pane.Chart._rect.Contains(mousePt) && !mousePt.Equals(lastMovedPoint)){// Provide Callback for User to customize the tooltipsif (this.CursorValueEvent != null){string label = this.CursorValueEvent(this, pane, mousePt);if (label != null && label.Length > 0){this.pointToolTip.AutomaticDelay = 1000;this.pointToolTip.SetToolTip(this, label);this.pointToolTip.Active = true;}else{this.pointToolTip.Active = false;}lastMovedPoint = mousePt;}else{double x, x2, y, y2;pane.ReverseTransform(mousePt, out x, out x2, out y, out y2);string xStr = MakeValueLabel(pane.XAxis, x, -1, true);string yStr = MakeValueLabel(pane.YAxis, y, -1, true);string y2Str = MakeValueLabel(pane.Y2Axis, y2, -1, true);this.pointToolTip.AutomaticDelay = 1000;this.pointToolTip.SetToolTip(this, "( " + xStr + ", " + yStr + ", " + y2Str + " )");this.pointToolTip.Active = true;}}elsethis.pointToolTip.Active = false;return mousePt;}

注:

这里只着重修改当用户重写此事件的情况下,即this.CursorValueEvent != null时,具体情况可跟据自己需要进行修改。

ZedGraph5.1.5源码与修改版源码下载

关注公众号:

霸道的程序猿

回复:

ZedGraph源码修改

ZedGraph5.1.5源码分析去掉鼠标悬浮内容闪烁问题(附源码下载)相关推荐

  1. echarts实现3D地图,轮播功能、背景图片、鼠标悬浮展示数据,附源码!

    echarts实现3D地图,轮播功能.背景图片.鼠标悬浮展示数据,附源码! 一.图片效果 二. 代码 一.图片效果 由于本地图片上传失败,无法展示完整的,不过是在此图的基础上加了轮播和底纹 二. 代码 ...

  2. spring源码分析第五天------springAOP核心原理及源码分析

    spring源码分析第五天------springAOP核心原理及源码分析 1. 面向切面编程.可以通过预 编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 切面(A ...

  3. spring源码分析第四天------springmvc核心原理及源码分析

    spring源码分析第四天------springmvc核心原理及源码分析 1.基础知识普及 2. SpringMVC请求流程 3.SpringMVC代码流程 4.springMVC源码分析 4.1 ...

  4. 通过这次源码分析直播了解到在中国真正关心源码的webrtc开发者只有1%

    通过这次源码分析直播了解到在中国真正关心源码的webrtc开发者只有1% 昨天晚上花费了2个多小时发给2000多个webrtc各个群里的朋友,截至到现在加入群观看的只有20多个,实际从头听到尾的只有1 ...

  5. OkHttpClient 源码分析 1(基于3.9.0的源码)

    OkHttpClient是目前开发 android 应用使用最广泛的网络框架,最近看了阿里的 httpdns 里面对于 dns 的处理,我们团队就想调研一下在项目中有什么利弊,并且框架中是否对 soc ...

  6. linux源码分析之cpu初始化 kernel/head.s,linux源码分析之cpu初始化

    linux源码分析之cpu初始化 kernel/head.s 收藏 来自:http://blog.csdn.net/BoySKung/archive/2008/12/09/3486026.aspx l ...

  7. python贪吃蛇源码_Python:游戏:贪吃蛇(附源码)

    Python:游戏:贪吃蛇(附源码) 发布时间:2018-09-05 09:59, 浏览次数:1295 , 标签: Python 贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么 ...

  8. 天天酷跑php源码_使用Java实现天天酷跑(附源码)

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的 ...

  9. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

最新文章

  1. “此环境变量太大, 此对话框允许将值设置为最长2047个字符”的解决办法
  2. POJ 1597 Function Run Fun
  3. BurpSuit配置抓包http和https请求
  4. 【正则化】Label Smoothing详解
  5. Spark 学习(十一) spark使用hive的元数据信息
  6. 题解【luogu P2421 bzoj P1407 [NOI2002]荒岛野人】
  7. NE40E面板ALM报警亮灯
  8. 勒让德方程(多项式)和缔合勒让德方程(多项式)和球谐函数
  9. 8位数码管静态显示c语言,数码管静态显示介绍_8位数码管静态显示程序解析
  10. 内存卡Android怎么删除,安卓手机怎么清理内置存储卡垃圾文件
  11. yolov 论文发表在什么期刊上_joe期刊是什么期刊_joe是什么意思_joe牌子
  12. ROSBridge - ROS系统与非ROS外部系统的通信的C++客户端实现
  13. 如何从福彩官网抓取 双色球历史数据
  14. SpringCloud学习笔记(五)服务发现Discovery
  15. 手把手教你建立私人数据检索库(二)
  16. 我弟今年高考,报的志愿是电子信息,到现在录取的是计算机科学与技术,哪个专业更好一些,2021年电子信息科学与技术专业大学排名及分数线【统计表】...
  17. 支付宝支付sdk解析
  18. CSS3 过渡-盒子切换之鼠标经过背景高亮
  19. 机器人在gazebo中使用四轮差速仿真模型时,转向不明显?
  20. 9.半兰伯特光照模型

热门文章

  1. 关于主机的思维导图_几张思维导图,让你清楚的知道ip地址怎么回事?
  2. 全国计算机二级表情包,计算机考试报名照片却上传成表情包 又一个段子?
  3. SpringMVC学习(五)——零配置实现SpringMVC
  4. Spring AOP详解一文搞懂@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing
  5. 使用mysqld --install命令时出现MSVCR120.dll文件丢失错误
  6. ext时间控件Ext.ux.form.DateTimeField和Ext.form.DateField的用法比较
  7. android studio多页面滑动,Android Studio之多个Activity的滑动切换(二)
  8. python并发处理list数据_python并发编程之多进程2--------数据共享及进程池和回调函数...
  9. mysql 复制表结构到一个新表_MySQL复制表数据或表结构到新表中
  10. java正则表达式 s报错_Java基础--正则表达式的规则