如何用MFC在窗口中绘制曲线

来源:互联网 发布:115会员淘宝不卖了 编辑:程序博客网 时间:2024/05/24 16:15

如何用MFC在窗口中绘制曲线? [问题点数:20分,结帖人u010266343]

 收藏
楼主发表于: 2013-04-12 19:44:27
如何用MFC在窗口中绘制曲线?
  • 千台团购进行时 免费LC服务器等你来体验
  •  
  • <iframe id="iframeu1636201_0" src="http://pos.baidu.com/acom?rdid=1636201&amp;dc=2&amp;di=u1636201&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=712x877&amp;dcb=BAIDU_UNION_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1456413057230&amp;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&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1349x557&amp;pss=1349x749&amp;cfv=0&amp;cpl=41&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1456413057&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&amp;ecd=1&amp;psr=1366x768&amp;par=1366x706&amp;pis=-1x-1&amp;ccd=24&amp;cja=true&amp;cmi=111&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1456413058&amp;qn=33433badebdfe5a1&amp;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&amp;dc=2&amp;di=u1636204&amp;dri=0&amp;dis=0&amp;dai=3&amp;ps=717x999&amp;dcb=BAIDU_UNION_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1456413057230&amp;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&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1349x557&amp;pss=1349x754&amp;cfv=0&amp;cpl=41&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1456413057&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&amp;ecd=1&amp;psr=1366x768&amp;par=1366x706&amp;pis=-1x-1&amp;ccd=24&amp;cja=true&amp;cmi=111&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1456413058&amp;qn=932eaa974a630493&amp;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
    #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] 引用 | 举报 | 管理
    #2 得分:0回复于: 2013-04-12 21:05:15
    没这么复杂吧!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #3 得分:0回复于: 2013-04-12 21:59:53
    建一个大数组,然后用moveto  lineto
    你只要定时更新数组就行了
    对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理
    #4 得分:0回复于: 2013-04-12 22:29:57
    由于本人尚属菜鸟,希望具体一些,最好是说明在哪个函数下添加什么代码,并附上源码
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #5 得分:5回复于: 2013-04-13 13:16:34
    在CView或CFormView视图里的OnDraw函数里,用参数pDC->MoveTo(x1,y1);pDC->LineTo(x2,y2)就可以画出一个直线.剩下的就按1楼说的方法进行画曲线及坐标轴了
    对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
    #6 得分:3回复于: 2013-04-13 17:33:39
    mschart控件,我今天刚开始用这个控件,很强大,你看看这个帖子
    http://www.cnblogs.com/shuncy/archive/2008/11/07/1328738.html

    如何用MFC在窗口中绘制曲线? [问题点数:20分,结帖人u010266343]

     收藏
    楼主发表于: 2013-04-12 19:44:27
    如何用MFC在窗口中绘制曲线?
    • 千台团购进行时 免费LC服务器等你来体验
    •  
    • <iframe id="iframeu1636201_0" src="http://pos.baidu.com/acom?rdid=1636201&amp;dc=2&amp;di=u1636201&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=712x877&amp;dcb=BAIDU_UNION_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1456413057230&amp;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&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1349x557&amp;pss=1349x749&amp;cfv=0&amp;cpl=41&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1456413057&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&amp;ecd=1&amp;psr=1366x768&amp;par=1366x706&amp;pis=-1x-1&amp;ccd=24&amp;cja=true&amp;cmi=111&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1456413058&amp;qn=33433badebdfe5a1&amp;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&amp;dc=2&amp;di=u1636204&amp;dri=0&amp;dis=0&amp;dai=3&amp;ps=717x999&amp;dcb=BAIDU_UNION_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1456413057230&amp;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&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1349x557&amp;pss=1349x754&amp;cfv=0&amp;cpl=41&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1456413057&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390424429&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Djobk6dCkSI__zsczNd8tasui8MLaLSwREKlT4r-A4-ZfYmFvPmtQzWYNTBx5TLy1%26wd%3D%26eqid%3Db0e0986d0005ef4e0000000256cf197e&amp;ecd=1&amp;psr=1366x768&amp;par=1366x706&amp;pis=-1x-1&amp;ccd=24&amp;cja=true&amp;cmi=111&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1456413058&amp;qn=932eaa974a630493&amp;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
      #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] 引用 | 举报 | 管理
      #2 得分:0回复于: 2013-04-12 21:05:15
      没这么复杂吧!
      对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
      #3 得分:0回复于: 2013-04-12 21:59:53
      建一个大数组,然后用moveto  lineto
      你只要定时更新数组就行了
      对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理
      #4 得分:0回复于: 2013-04-12 22:29:57
      由于本人尚属菜鸟,希望具体一些,最好是说明在哪个函数下添加什么代码,并附上源码
      对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
      #5 得分:5回复于: 2013-04-13 13:16:34
      在CView或CFormView视图里的OnDraw函数里,用参数pDC->MoveTo(x1,y1);pDC->LineTo(x2,y2)就可以画出一个直线.剩下的就按1楼说的方法进行画曲线及坐标轴了
      对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
      #6 得分:3回复于: 2013-04-13 17:33:39
      mschart控件,我今天刚开始用这个控件,很强大,你看看这个帖子
      http://www.cnblogs.com/shuncy/archive/2008/11/07/1328738.html
      0 0
      原创粉丝点击
      热门IT博客
      热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 女性性冷淡 冷淡反义词 性冷淡女人 老婆性冷淡 性冷淡风 女性冷淡 冷淡 性冷淡原因 女朋友冷淡 性冷淡意思 女生性冷淡 老公性冷淡 产后性冷淡 性冷淡危害 我性冷淡 何为性冷淡 性冷淡男 性冷淡色 啥叫性冷淡 性冷淡是啥 女子性冷淡 如何性冷淡 冷淡的意思 性冷淡测试 极简性冷淡风穿搭 性冷淡的症状 性冷淡的表现 女性性冷淡十四种原因 冷淡的反义词 女性性冷淡原因 性冷淡女人怎么办 越冷淡天秤男他越爱你 女朋友性冷淡 女性性冷淡怎么调节 性冷淡干涩没水怎么解决 女性性冷淡药 女主冷淡男主深情偏执 性冷淡自测题 女性性冷淡吃什么药 性冷淡怎么办男 冷淡是什么意思