CChart,自编的曲线绘制类,基于MFC,自我认为非常强大

baita96 2010-02-27 08:15:43
由于经常需要在程序中绘制一些曲线,一直在找一个好用的函数库,可惜总找不到合适的。没办法,只好自己开发了一个,自己取名叫CChart,这个玩意完全基于MFC,其雏形是SourceForge.net上的那个CPlot。CChart已经从很多方面大大扩展了CPlot的功能。
CChart主要特点:
1、可以绘制任意多条曲线,每条曲线任意选择颜色、线宽、线性等参数,可对封闭曲线进行填充。
2、对于多条曲线,可以以多种方式自动选择颜色,线型。
3、每条曲线可以以多种方式设置标记(Marker),marker有近10种形状可以选择,并可以选择大小和填充状态,marker的绘制方式也有多种,例如每个点绘制,或者每隔几个点绘制一个,或者总共绘制几个。
4、自动选择坐标轴的范围,也可指定坐标轴范围,坐标轴可以指定标题,颜色,字型及字体大小等。
5、上、下、左、右四个坐标轴可选。
6、两级网格,主网格及副网格,并可设置网格粗细、线型、颜色等。
7、可设置背景颜色,或者设置渐变背景。
8、图像标题以及副标题。
9、内置图例(Legend),图例的位置可任意拖动。
10、缩放功能,不过目前放大不甚完善,主要是俺不知道怎么在内存DC中创建比屏幕大的Bitmap。
11、内置右键快捷菜单。
12、完备的图元对象(曲线、坐标轴、图例等)的高亮和选择功能。
13、内置等高线绘制功能,只需设置等高线条数即可,也可以分别设置各条等高线的高度值。
14、内置样条曲线绘制功能,可以绘制抛物样条、三次样条、Bezier样条、任意次B样条曲线,并可进行最小二乘拟合。
15、具备分区功能,可以2分裂(左右、上下),3分裂(左2右1、左1右2,上2下1、上1下2)、4分裂,更多的分区目前还没做。
16、具备分层功能(layer),主要是为了实现层与层之间不同的刻度,目前的分层功能所有图层共享X轴,各图层独立绘制Y轴。我觉得独立绘制X轴的功能没有意义,就没有实现。
17、采用毫秒级高精度定时器,实现了实时曲线的显示功能。可以设置定时器的步长等参数,可以同时绘制多条实时曲线。
........................................................
总之,俺觉得CChart的曲线绘制功能应该可以和Origin软件相比拟。

CChart的使用相当简单。
已经把CChart整合到一个视类中,使用时只需要继承这个视类即可。
具体步骤如下。
1、首先生成一个基于文档/视图结构的MFC程序。
2、把CChart目录拷贝到生成的程序目录中。
3、打开VC生成的C**View.h和C**View.cpp,把类的基类替换成CChartView,使用VC编辑器的全部替换功能即可。
4、把C**View.cpp的OnDraw函数中的内容改成:
CChartView::OnDraw( pDC );
5、在ClassWizard中增加消息OnLButtonDown,OnLButtonUp,OnLButtonDblClick,OnRButtonDown,OnMouseMove的响应函数,不需要编写任何代码。
6、在C**View.h中加入头文件 #include "Chart\PlotHeaders.h"。
7、由于静态库不能包含资源,而CChart具备内置资源,因此需要在VC的View->Resource Include菜单中加入一句 #include "Chart\PlotResources.rc2"。
8、链接时,记得把plotd.lib(Debug模式)或plot.lib(Release模式)链接进去。
Come on,baby,通过以上步骤,已经实现了强大的曲线绘制功能,剩下的工作就是把曲线加进去就可以了。
加曲线的方法简单介绍如下,更详细一点的代码可以参见压缩文件。
std::vector<DataPoint> vData;
DataPoint dp;
for(int i=0;i<100;i++)
{
dp.x=i/2;
dp.y=sin(dp.x);
vData.push_back(dp);
}
AddCurve(vData);

当然,如果不想使用俺做的视类,直接使用CChart类也是可以的,不过相对来说,要复杂一些了。

压缩文件CChart.7z可以在vckbase的ftp中下载,地址 ftp://vckpub:vckbase@218.75.9.231/CChart.7z ,文件中包含了CChart所需的头文件以及静态链接库,其中plotd.lib是debug模式用的,plot.lib是release模式用的。
如有什么问题,欢迎联系baita00@yahoo.com.cn。


另外,CChart只能绘制二维曲线,需要绘制三维曲线的话,实在抱歉了。不过目前也在考虑这件事,还有一个想法是把GDI绘图改成OpenGL。
...全文
1392 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywscr0000 2012-11-01
  • 打赏
  • 举报
回复
谢谢分享,顶
c285410690 2012-07-23
  • 打赏
  • 举报
回复
哎,没有我想要的东西呢
yhp1888 2010-03-01
  • 打赏
  • 举报
回复
楼主确实非常强大。

我也有个绘图类CMemDraw
CMemDraw主要特点:
1、可以绘制任意多条曲线/点/面/形状(我称为绘图细胞CELL),每个CELL任意选择颜色、线宽、线性等参数,可对封闭CELL进行填充。
2、对于多个CELL,可以以多种方式自动选择颜色,线型。
3、每个CELL可以以多种方式设置标记(flag),flag有10种以上形状可以选择,并可以选择大小和填充状态,flag的绘制方式也有多种,....
4、自动选择坐标轴的范围,也可指定坐标轴范围,坐标轴可以指定标题,颜色,字型及字体大小等。
.............
10、缩放功能,你可以随意加入你的缩放比例,通过一个函数的参数加入就可以了。也可以用你的鼠标中间键,向上扩大,向下缩小,....
.............
1x、背景图功能,你可以任意选若干CELL为背景图,用你的鼠标中间键扩大缩小时,背景图不动。
1x、所有绘图CELL,你可调用参数生成,也可以传入外部图形。
.............


我的是给我自己用,不能给出源码,所以不在网上发布。

没有源码的东西,包括Windows操作系统,更强大,都没有源码,我们都不感兴趣。
nrxtgcb 2010-02-28
  • 打赏
  • 举报
回复
这个没有源码吧?只公开了lib文件?
sjdev 2010-02-28
  • 打赏
  • 举报
回复
抓个图上来看看.
OOOqqqOOO 2010-02-28
  • 打赏
  • 举报
回复
baita96 2010-02-28
  • 打赏
  • 举报
回复
抱歉,我也不知道该怎么贴图,据说论坛不能贴图,我就先把图片上传到了vckbase的ftp,然后贴的是ftp的地址。
我这里先显示一个红叉,然后右键选择显示图片就可以了
sjdev 2010-02-28
  • 打赏
  • 举报
回复
恩,我这边也是一个图都看不到。你插图的方式不对。
baita96 2010-02-28
  • 打赏
  • 举报
回复
直接去vckbase的ftp上下载吧,ftp://vckpub:vckbase@218.75.9.231/,在下面找png格式的图像,complex.png,Contour.png和split.png
昨夜无风 2010-02-28
  • 打赏
  • 举报
回复
是你的截图有问题还是我的显示有问题,我怎么看到的是黑的!

不过,还是支持一下楼主!!
baita96 2010-02-28
  • 打赏
  • 举报
回复
再贴一张
sewinten 2010-02-28
  • 打赏
  • 举报
回复
不错,多谢楼主的分享!
baita96 2010-02-28
  • 打赏
  • 举报
回复
等高线
baita96 2010-02-28
  • 打赏
  • 举报
回复
分裂视图,呵呵
klkvc386 2010-02-27
  • 打赏
  • 举报
回复
Mark...........
WizardK 2010-02-27
  • 打赏
  • 举报
回复
jf
xsc2001 2010-02-27
  • 打赏
  • 举报
回复
呵呵,不错,支持一下!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧