最近一致在开发能源平台,平台中很多能耗数据都是通过使用微软的chart控件进行图形呈现的。考虑到要给用户更为直观的呈现效果,需要对原有控件的功能进行扩展。微软chart控件没有第三方样chart样式炫酷,但是胜在可定制性强,中文手册详细,很多效果能够自己写出来。

  主要实现功能:1.最大值,最小值,平均值展示   2.鼠标移动到数据点绘制竖线,用tooltip的方式展示数据

  最终呈现效果如图:

解决方案:

(1)最大值,最小值,平均值呈现

  之前在网上找了好久都没有想要的效果,第三方控件往往都能直接设置。最开始我的解决方法是在ChartArea中添加单独的series展示最值,但是呈现效果不佳:

  在看了微软的技术手册后,发现可以在ChartArea中添加Stripline实现。以插入最大值线条为例,代码如下:

//最大线条double max = ammeter.Max();StripLine stripMax = new StripLine();stripMax.Text = string.Format("最大:{0:F}", max);//展示文本stripMax.BackColor = Color.FromArgb(208, 109, 106);//背景色stripMax.Interval = 0;//间隔stripMax.IntervalOffset = max;//偏移量stripMax.StripWidth = 0.001;//线宽stripMax.ForeColor = Color.White;//前景色stripMax.TextAlignment = StringAlignment.Near;//文本对齐方式chartInfo.ChartAreas["ammeter"].AxisY.StripLines.Add(stripMax);//添加到ChartAreas中

(2)实现鼠标移动到数据点绘制竖线,用tooltip的方式展示数据

  chart中可以对画图区域使用HitTest进行数据点检测,之前的方案是在鼠标移动的过程中对当前鼠标的坐标区域(x为当前坐标,y为画图区域的高 )进行数据检测,移动的过程中绘制跟随鼠标的线条。实现后发现效果并不是很好,HitTest在数据点周围的series都会判定为数据点,所以线条一直在绘制,而想要的效果鼠标移动的过程中仅在数据点时才绘制竖线。

  要在数据点位置绘制线条需要获得数据点的相对坐标,网上一直没有找到解决办法。起初通过x,y轴的偏移量,0点的坐标,绘图区域的坐标可以实现相对坐标的获取,但是发现这样有时计算会有很大的偏差。同样通过查找技术手册后,发现微软给了获取x,y轴相对坐标的方法。

Point lastPoint = new Point();//上次点的坐标ToolTip tp = new ToolTip();//tooltip展示条//绘制竖线坐标Point p1 = new Point(0, 0);Point p2 = new Point(0, 0);/// <summary>/// 鼠标移动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void chartInfo_MouseMove(object sender, MouseEventArgs e){this.Refresh();//刷新chart,使用clear会使chart上的图形完全清空Pen pen = new Pen(Color.Yellow);Graphics g = chartInfo.CreateGraphics();string seriesInfo = ""; //tooltip文本if (e.Location != lastPoint)//如果在上次点的位置不进行操作,此处操作会引发chart控件的refresh操作造成界面闪烁{for (int y = 0; y <= chartInfo.Size.Height; y++)//线条范围进行碰撞检测{HitTestResult result = chartInfo.HitTest(e.X, y);if (result.ChartElementType == ChartElementType.DataPoint){foreach (DataPoint dpp in result.Series.Points)//数据点默认样式 使用索引的方式修改偶尔会出现无法正常修改完{dpp.MarkerStyle = MarkerStyle.Diamond;dpp.MarkerColor = Color.White;dpp.MarkerSize = 5;}int i = result.PointIndex;DataPoint dp = result.Series.Points[i];dp.MarkerStyle = MarkerStyle.Star4;//捕获到数据点的样式dp.MarkerColor = Color.Orange;dp.MarkerSize = 15;//获取数据点的相对坐标p1 = new Point((int)chartInfo.ChartAreas["ammeter"].AxisX.ValueToPixelPosition(dp.XValue), 0);p2 = new Point((int)chartInfo.ChartAreas["ammeter"].AxisX.ValueToPixelPosition(dp.XValue), chartInfo.Size.Height);seriesInfo = string.Format("分项:{0}  时间:{1}  能耗值:{2}", result.Series.LegendText, DateTime.FromOADate(dp.XValue), dp.YValues[0]);break;}}tp.AutoPopDelay = 5000;//展示tooltiptp.ShowAlways = false;tp.IsBalloon = true;tp.SetToolTip(chartInfo, seriesInfo);}lastPoint = e.Location;//记录本次位置g.DrawLine(pen, p1, p2);//绘制竖线}

写在最后

  微软技术手册真香

winform c# chart控件添加边界值线条以及扩展性功能相关推荐

  1. C# Winform的panel控件添加背景图片后窗体闪烁问题解决办法

    C# Winform的panel控件添加背景图片后窗体闪烁问题解决办法 参考文章: (1)C# Winform的panel控件添加背景图片后窗体闪烁问题解决办法 (2)https://www.cnbl ...

  2. 基于Winform的Chart控件的简单使用(Chart控件中的条形统计图、折线统计图、扇形统计图的简单使用)

    Chart控件集成了颇多的统计图模型,拿来即用的理念大大节省了开发的时间.下面演示最常见的三种统计图模型的使用. 效果展示: C#代码: using System; using System.Coll ...

  3. C#:winform使用chart控件绘制折线图,时间轴可缩放

    最近做的一个项目里用到这部分 打算记录下来 挖个坑 已填 Chart坐标轴横轴为时间,纵轴是数值 如果只是一次性绘图,那么遍历一遍数据即可 如果想连续绘制(比如按照时间更新绘制),就需要一个Timer ...

  4. chart控件删除最左边点_常见功能测试点的测试用例大全

    登录.添加.删除.查询模块是我们经常遇到的,这些模块的测试点该如何考虑? 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不 ...

  5. [WinForm]Dundas Chart控件学习(附源码)

    1.Dundas公司简介 加拿大的一家公司,专业做图表展现的,很牛,据说现在被Microsoft收购了.官网地址:http://www.dundas.com/ 2.Chart基本要素 3.最简单的柱状 ...

  6. winform 使用chart控件画圆环图

    1如果设置圆环上的颜色,不要按着Palette的来,可以自定义 可以通过设置PaletteCustomColors来进行自定义颜色 2.如何在圆环中加字,如下图所示 可以点击打Titles进行titl ...

  7. C# chart控件实时动态显示数据

    这里介绍了一个最简单的实时显示数据的完整示例, 本文参考了 使用MSChart实时动态显示折线图 ,谢谢原作者的分享. 平台:VS2013,C#windows程序. 源代码下载:http://down ...

  8. Silk.Net Opengl 创建基于WPF或者Winform 的显示控件

    背景: Silk.GL, 基于Net6.0 跨平台,微软封装的一套三维框架, 总的来说, 参考OpenTK, SharpGL,Vulkan ,DX 等等. 因为基于WPF写的一些demo,每次额外弹出 ...

  9. C# Winform Chart控件用法1

    1.Chart控件五大核心" 图表属性 "--它们均是" 集合 " ChartAreas属性 Series属性 Legends属性 Titles 属性 Anno ...

  10. Winform中使用DevExpress时给控件添加子控件的方法

    场景 在Winform中使用DevExpress时经常使用PanelControl控件用来进行布局设计,因此需要在代码中生成控件并添加子控件. 实现 一种是设置要添加的自控件的Parent属性为容器控 ...

最新文章

  1. 英语语法总结--连词
  2. 准时制 jit 减少库存
  3. 通过类或ID记录上一个被选中的标签或者数字
  4. redis配置主从没效果_跟我一起学Redis之加个哨兵让主从复制更加高可用
  5. 【洛谷 P3304】[SDOI2013]直径(树的直径)
  6. 一个大屏监控380个泵房,13000个设备,智能水务是怎么实现的?
  7. robotium之无name、ID仅有desc定位
  8. L1-004. 计算摄氏温度-PAT团体程序设计天梯赛GPLT
  9. Windows下的修改Tomcat的可用内存
  10. 7.GitLab 创建 merge request
  11. 毕设题目:Matlab优化覆盖
  12. Android学习视频集合
  13. OpenLayers 5 使用turf.js渲染克里金插值计算的等值面
  14. 当下的力量实践手册读书笔记(1.29)
  15. 基于ATT-LSTM的语音情感分类
  16. Python:7-1 温度转换 (6分)
  17. android 格式化后关机,Android系统为什么用久了会卡?那格式化还原后还会卡吗?...
  18. 102.(leaflet篇)leaflet态势标绘-分队战斗行动修改 (燕尾)
  19. 《悟透JavaScript》之 甘露模型二
  20. Ubuntu环境中英文切换

热门文章

  1. SpringCloud升级之路2020.0.x版-1.背景
  2. winhttp API 获取服务器文件大小(更新时间)等
  3. 电子口岸客户端控件首次安装
  4. 基于51单片机的12864液晶显示4X4矩阵键盘程序仿真
  5. 红帽linux镜像下载教程,最新版:如何到Redhat官网下载RedHat镜像及申请试用安装序号...
  6. CImage类进行图像处理1(基础篇)
  7. Unity字体展示下载
  8. 前端开发:颜色代码速查表【英文颜色、HEX格式、RGB格式】
  9. python爬取新浪博客_Python爬取韩寒全部新浪博客
  10. 计算机机械和设计专业介绍,机械类包括哪些专业