前段时间调试芯片,需要画直方图,因为我的框架是基于MFC的,时间又紧迫,当时要求我速度搞,所以饥不择食的寻遍网上的各种轮子。

首先是我们知道如果有数据的话可以直接在excel上面利用它强大的特性来画图,微软的office其实提供了这些画图的sdk接口,只要你加载进去就可以,但是太麻烦,而且网上的例子比较少,需要一定的时间去摸索,但是是否有其他开源的框架也能画出美丽的图表呢?

我们都知道如果是qt的话,它的QCustomPlot比较好用,其实我就画过,但是我嫌弃qt用MFC又搞了一个。我找到的第一个MFC控件是TeeChart,这个控件在Debug下面是可以运行跑出来的,但是由于不是正版,而且很多坑,在Release模式下是编译不通过,我基本试遍所有版本。而且我的数据是一个动态流,对刷新帧率这个有一定的要求,所以说TeeChart各种原因导致我放弃了这个控件,但是如果有人需要静态图以及允许在debug下面使用的话,我会建议用这个控件。

然后我又找了另外一个轮子就是High-speed Charting Control,这个轮子是比较适合大家使用的。因为它的代码是开源的,而且bug极少,测了一下效果也不错。

链接:https://pan.baidu.com/s/1o5QR9GRMx5aDreesMYh0Cg

提取码:00r1

只需要下载完这部分源代码,然后加载你项目路径下,按需要去调用即可。以下是这个控件的代码分布

这是我在代码里初始化控件

由于我只用到直方图部分,所以按照这个去设点,把点统计出来按照接口设置即可,如果有用到的可以试试。

出来后效果

控件的主要特点是:

  • 高速绘图(轴固定时),允许快速绘制数据
  • 无限数量的数据序列(内存是限制)
  • 每个数据序列的数据量不受限制
  • 支持线图,点图,平面图,柱状图,K线图 和甘特图系列
  • 最多四个轴(左,下,右和上轴)
  • 标准轴,对数轴或日期/时间轴
  • 自动伸缩的坐标轴, 翻转的坐标轴(相互独立)
  • 轴标签
  • 点标签
  • 平滑的曲线
  • 网格
  • 图例和标题
  • 交互性(在控件中发生特定事件时的通知)
  • 支持手动缩放和鼠标平移
  • 支持鼠标指针
  • 支持轴上的滚动条
  • 高度可定制(颜色,标题,标签,边缘,字体等)
  • 支持UNICODE
  • 支持打印和保存到图像文件

这个基本满足了大家对于图表的需求,而且我觉得对比excel也比较美观的。由于MFC如果手动去描绘的话,这个过程可能不太顺畅,因为要耗费一定的时间,所以我们会建议你优先使用别人的开源框架,别人已经踩过坑造出的轮子是最优的。

当然,我在芯片的视觉处理中使用了大量的opencv,opencv的强大,画一个折线图都不在画下,但是相比较而言,opencv只能给出一个比较静态的图,如果你要缩放扩大,或者颜色渲染,图文修改都会比较麻烦。

总的来说,最优的方案还是建议用qt来画图吧,MFC比较麻烦,它的难度会比QT高,QT在工业领域上的占比很高。