欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-14 18:58:58
场景 在使用ZedGraph绘制曲线图时,将鼠标悬浮时内容闪烁,且频率很高。 找到其源码,发现不论鼠标移动的范围大小,甚至乎不论鼠标是否移动,都要刷新一次Tooltip。 注: 博客主页:https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ......

场景

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

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

 

 

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

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

注:

博客主页:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

首先来到zedgraph的官网

然后点击file下的zedgraph source

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

 

 

选择对应版本,这里是5.1.5

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

 

 

下载成功后,将zip解压

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

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

 

 

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

然后找到zedgraphcontrol.events.cs

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

 

 

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

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

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

 

 

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

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

zgc.isshowpointvalues = true;

 

那么就要修改

handlepointvalues( mousept );

这个方法

首先声明一个类变量

private object lastobj;

 

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

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

 

 

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

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源码修改