一个从CStatic派生的动态曲线图绘制控件

关键词:MFC GDI 曲线图绘制

本控件只是一个很简单的控件,比任务管理器里的曲线图略复杂,不具有图例、鼠标移动可以捕捉曲线上的坐标等特性。
具体如下:
  1)从CStatic派生,容易在对话框中使用。
  2)能够随对话框的缩放自动改变大小,这里假设对话框中其它元素的位置基本不变。
  3)曲线的粗细,颜色,线型(实,虚线)可以自由设置。
  4)可以控制曲线的隐藏/显示。
  5)两个坐标轴,Y轴根据数据自适应,实际数据最大最小值各偏离5%是坐标轴的最大最小值(简化起见,坐标轴采用五等分)。X轴是时间轴,一个像素点代表一个数据点,假设采样按一定的频率。
  6)可以添加多条曲线。
  7) 使用双缓冲,避免图形闪烁。
做一个CStatic派生控件的基本步骤:
  1)定义一个从CStatic派生的类。
  2)重载有关消息映射,WM_PAINT,WM_ERASEBKGND
  3) 在OnPaint中绘图,在这里根据实际的需要做不同的计算,绘制。大致可分为以下几步,I布局计算,CStatic是整个绘图区,将这个区域划分为边缘空白,坐标轴区,曲线区等几个部分,需要算出各个部分的矩形顶点,以便控制曲线的绘制。II绘制背景。III绘制坐标轴。IV绘制曲线。其中需要用到简单的坐标映射知识。
运行截图:





具体的可以看源代码。下载文件LineChartControlDemo.rar (200.48 KB , 下载:4853次)
可以作为控件使用的是LineChartCtrl.h,LineChartCtrl.cpp,MemDC.h这三个文件。

其它可供参考的源代码链接:
http://www.codeproject.com/dialog/CStatusGraphCtrl.asp
http://www.vchelp.net/vchelp/zsrc/realtime_plot.zip
http://www.codeproject.com/miscctrl/histogramctrl.asp
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1631


需要更强大的绘图功能怎么办?只要理解了计算图形布局和画图的过程,会使用双缓冲,如果需要在单文档的视图中使用,同样在OnPaint中处理绘制,并处理其它有关消息就可以了(主要是ON_SIZE时要重新计算布局),如果要做一个通用的控件,只需要从CWnd派生即可,要多强大就看你的想像力了。

对话框中的控件随对话框的大小改变做相应的变化,本例仅展示了控制图形显示控件和Exit按钮。要做更复杂的控制,原理是一样的,无非是记住和计算更多的位置,主要需要处理WM_SIZE消息和利用MoveWindow函数。

总之,图形界面的程序,无论是绘制曲线还是绘制窗口,无非就是计算位置(在哪儿绘制,这需要处理相关消息以取得窗口,客户区大小的变化),用GDI函数绘图(MoveWindow也是调用了系统的绘图函数才能画出窗口)。

Update:
2008-8-11 有同学反应源代码在VC6.0下无法编译通过,将源代码中的CArray用vector替换,对C++稍微熟悉一点儿的话,做这件事需要5~20分钟。
源代码这里下载。下载文件LineChartControlDemo.rar (210.67 KB , 下载:4339次)
标签: MFC
评论: 11 | 引用: 0 | 阅读: 10908
  • 1 
mazl1982 [ 2008-05-25 13:45 | 回复 | 编辑 删除 ]
大哥 你QQ号码多少?想请教你!
王者之剑 [ 回复于2008-05-25 14:10 网址 | 编辑 删除 ]
几乎不上QQ,最好的联系方式是发邮件(地址在首页),请将问题描述清楚。邮件一般两天内会得到回复,最迟不会超过一个星期。
十万火急救命的事情就不要找我了,以免误事。
MSN有一个:agoodsong at hotmail.com
不保证随时在线。
IM这样的工具交流效率极低,浪费时间,不喜欢用,见谅。
celery [ 回复于2008-06-13 15:40 | 编辑 删除 ]
下载的源码不全,麻烦给发一份好吗?
王者之剑 [ 2008-06-13 16:41 网址 | 回复 | 编辑 删除 ]
我可以保证那个源代码里不需要再改动一个字节就能编译运行。
不过我想你肯定碰到了不能运行的问题。
不管怎样,还是发邮件给你了。
fff [ 2008-07-29 22:48 | 回复 | 编辑 删除 ]
多谢,学习了。。。
mm [ 2008-11-01 18:27 | 回复 | 编辑 删除 ]
大哥 你还上这网不?
需要你的控件啊,有OCX格式的吗?mylikejin@126.com
谢谢了
西欧 [ 2009-05-23 19:26 | 回复 | 编辑 删除 ]
可以给我发一份详细的有关MFC曲线图的东西吗?我要用它来统计数据包流量 但是我自己弄不出来 先谢过!!!
allen [ 2010-12-06 13:49 网址 | 回复 | 编辑 删除 ]
hfxv
bccfg [ 2010-12-06 13:51 网址 | 回复 | 编辑 删除 ]
.212.0
kjj [ 2010-12-06 13:56 | 回复 | 编辑 删除 ]
yttdtytrfhg
jj [ 2011-12-03 13:48 | 回复 | 编辑 删除 ]
demo程序运行一段时间后,曲线会跑到y轴的左边!怎么解决,请问是什么原因
  • 1 
发表评论
昵 称: (必须)
密 码: (未注册用户可不填)
网 址: 邮 箱:
验证码: 验证码图片 选 项:
头 像:
内 容: