- 关注
- u010266343
- 河水0
- 本版等级:
- 结帖率:50%
楼主发表于: 2013-04-12 19:44:27
如何用MFC在窗口中绘制曲线?
<iframe id="google_ads_iframe_/8456/IDG.CN_B2B_csdn.net_0" title="3rd party ad content" name="google_ads_iframe_/8456/IDG.CN_B2B_csdn.net_0" width="728" height="90" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom;"></iframe>
千台团购进行时 免费LC服务器等你来体验
<iframe id="iframeu1636201_0" src="http://pos.baidu.com/acom?rdid=1636201&dc=2&di=u1636201&dri=0&dis=0&dai=2&ps=712x877&dcb=BAIDU_UNION_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1456413057230&ti=%E5%A6%82%E4%BD%95%E7%94%A8MFC%E5%9C%A8%E7%AA%97%E5%8F%A3%E4%B8%AD%E7%BB%98%E5%88%B6%E6%9B%B2%E7%BA%BF%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x749&cfv=0&cpl=41&chi=1&cce=true&cec=UTF-8&tlm=1456413057&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=111&col=zh-CN&cdo=-1&tcn=1456413058&qn=33433badebdfe5a1&tt=1456413057137.367.420.421" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
<iframe id="iframeu1636204_0" src="http://pos.baidu.com/acom?rdid=1636204&dc=2&di=u1636204&dri=0&dis=0&dai=3&ps=717x999&dcb=BAIDU_UNION_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1456413057230&ti=%E5%A6%82%E4%BD%95%E7%94%A8MFC%E5%9C%A8%E7%AA%97%E5%8F%A3%E4%B8%AD%E7%BB%98%E5%88%B6%E6%9B%B2%E7%BA%BF%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x754&cfv=0&cpl=41&chi=1&cce=true&cec=UTF-8&tlm=1456413057&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=111&col=zh-CN&cdo=-1&tcn=1456413058&qn=932eaa974a630493&tt=1456413057137.457.502.503" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:6- 关注
- lhfslhfs
- 青松2
- 本版等级:
#1 得分:12回复于: 2013-04-12 19:51:03
http://blog.csdn.net/dongliqiang2006/article/details/5466230
本控件只是一个很简单的控件,比任务管理器里的曲线图略复杂,不具有图例、鼠标移动可以捕捉曲线上的坐标等特性。
具体如下:
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 , 下载:2954次)
可以作为控件使用的是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分钟。
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- u010266343
- 河水0
- 本版等级:
#2 得分:0回复于: 2013-04-12 21:05:15
没这么复杂吧!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- dcmilan
- 南京短暂的春天
- 本版等级:
#3 得分:0回复于: 2013-04-12 21:59:53
建一个大数组,然后用moveto lineto
你只要定时更新数组就行了
对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理
- 关注
- u010266343
- 河水0
- 本版等级:
#4 得分:0回复于: 2013-04-12 22:29:57
由于本人尚属菜鸟,希望具体一些,最好是说明在哪个函数下添加什么代码,并附上源码
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- hdg3707
- hdg3707
- 本版等级:
-
#5 得分:5回复于: 2013-04-13 13:16:34
在CView或CFormView视图里的OnDraw函数里,用参数pDC->MoveTo(x1,y1);pDC->LineTo(x2,y2)就可以画出一个直线.剩下的就按1楼说的方法进行画曲线及坐标轴了
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- lllgyt327
- lllgyt327
- 本版等级:
#6 得分:3回复于: 2013-04-13 17:33:39
mschart控件,我今天刚开始用这个控件,很强大,你看看这个帖子
http://www.cnblogs.com/shuncy/archive/2008/11/07/1328738.html
- 关注
- u010266343
- 河水0
- 本版等级:
- 结帖率:50%
楼主发表于: 2013-04-12 19:44:27
如何用MFC在窗口中绘制曲线?
<iframe id="google_ads_iframe_/8456/IDG.CN_B2B_csdn.net_0" title="3rd party ad content" name="google_ads_iframe_/8456/IDG.CN_B2B_csdn.net_0" width="728" height="90" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom;"></iframe>
千台团购进行时 免费LC服务器等你来体验
<iframe id="iframeu1636201_0" src="http://pos.baidu.com/acom?rdid=1636201&dc=2&di=u1636201&dri=0&dis=0&dai=2&ps=712x877&dcb=BAIDU_UNION_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1456413057230&ti=%E5%A6%82%E4%BD%95%E7%94%A8MFC%E5%9C%A8%E7%AA%97%E5%8F%A3%E4%B8%AD%E7%BB%98%E5%88%B6%E6%9B%B2%E7%BA%BF%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x749&cfv=0&cpl=41&chi=1&cce=true&cec=UTF-8&tlm=1456413057&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=111&col=zh-CN&cdo=-1&tcn=1456413058&qn=33433badebdfe5a1&tt=1456413057137.367.420.421" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
<iframe id="iframeu1636204_0" src="http://pos.baidu.com/acom?rdid=1636204&dc=2&di=u1636204&dri=0&dis=0&dai=3&ps=717x999&dcb=BAIDU_UNION_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1456413057230&ti=%E5%A6%82%E4%BD%95%E7%94%A8MFC%E5%9C%A8%E7%AA%97%E5%8F%A3%E4%B8%AD%E7%BB%98%E5%88%B6%E6%9B%B2%E7%BA%BF%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x754&cfv=0&cpl=41&chi=1&cce=true&cec=UTF-8&tlm=1456413057&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=111&col=zh-CN&cdo=-1&tcn=1456413058&qn=932eaa974a630493&tt=1456413057137.457.502.503" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:6- 关注
- lhfslhfs
- 青松2
- 本版等级:
#1 得分:12回复于: 2013-04-12 19:51:03
http://blog.csdn.net/dongliqiang2006/article/details/5466230
本控件只是一个很简单的控件,比任务管理器里的曲线图略复杂,不具有图例、鼠标移动可以捕捉曲线上的坐标等特性。
具体如下:
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 , 下载:2954次)
可以作为控件使用的是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分钟。
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- u010266343
- 河水0
- 本版等级:
#2 得分:0回复于: 2013-04-12 21:05:15
没这么复杂吧!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- dcmilan
- 南京短暂的春天
- 本版等级:
#3 得分:0回复于: 2013-04-12 21:59:53
建一个大数组,然后用moveto lineto
你只要定时更新数组就行了
对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理
- 关注
- u010266343
- 河水0
- 本版等级:
#4 得分:0回复于: 2013-04-12 22:29:57
由于本人尚属菜鸟,希望具体一些,最好是说明在哪个函数下添加什么代码,并附上源码
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- hdg3707
- hdg3707
- 本版等级:
-
#5 得分:5回复于: 2013-04-13 13:16:34
在CView或CFormView视图里的OnDraw函数里,用参数pDC->MoveTo(x1,y1);pDC->LineTo(x2,y2)就可以画出一个直线.剩下的就按1楼说的方法进行画曲线及坐标轴了
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
- 关注
- lllgyt327
- lllgyt327
- 本版等级:
#6 得分:3回复于: 2013-04-13 17:33:39
mschart控件,我今天刚开始用这个控件,很强大,你看看这个帖子
http://www.cnblogs.com/shuncy/archive/2008/11/07/1328738.html