ZedGraph5.1.5源码分析去掉鼠标悬浮内容闪烁问题(附源码下载)
场景
在使用zedgraph绘制曲线图时,将鼠标悬浮时内容闪烁,且频率很高。
找到其源码,发现不论鼠标移动的范围大小,甚至乎不论鼠标是否移动,都要刷新一次tooltip。
注:
博客主页:
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
首先来到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 tooltips if ( 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; } else this.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 ); else valuehandler.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; } } else this.pointtooltip.active = false; } else this.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 tooltips if (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; } } else this.pointtooltip.active = false; return mousept; }
注:
这里只着重修改当用户重写此事件的情况下,即this.cursorvalueevent != null时,具体情况可跟据自己需要进行修改。
zedgraph5.1.5源码与修改版源码下载
关注公众号:
霸道的程序猿
回复:
zedgraph源码修改
下一篇: python中adb有什么功能