基于单文档的VC++动态曲线绘制

VC绘制曲线的学习 // ProjectView.cpp : implementation of the CProjectView class // #include "stdafx.h" #include "Project.h" #include "ProjectDoc.h" #include "ProjectView.h" #include "afxmt.h" #ifdef _DEBUG #define n 阅读详情

摘自:http://blog.sina.com.cn/s/blog_8269650b01013rly.html

CEvent EndPaintLine;//用来控制绘制线程结束的事件
POINT polyline[61];//存放动态数据曲线数据值的数组
DWORD pLinePoints;//当前需绘制曲线的点数
int TimeSpan_GetData;//绘制动态曲线的时间间隔,具体系统中可在界面上加一微调按钮调整
UINT DataLineThread(LPVOID lp)
{
 //首先创建画实时曲线的画笔和画刷
 CPen* pPenRed=new CPen;
 CPen* pPenGreen=new CPen;
 CPen* pPenBlue=new CPen;
 CPen* pPenBlack=new CPen;
 CPen* pPenBKcolor=new CPen;
 CBrush* pBrushBlack=new CBrush;
 pPenRed->CreatePen(PS_DOT,1,RGB(150,0,0));
 pPenBlue->CreatePen(PS_DOT,1,RGB(10,150,255));
 pPenBlack->CreatePen(PS_SOLID,1,RGB(0,0,0));
 pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));
 pPenBKcolor->CreatePen(PS_SOLID,1,RGB(190,190,190));
 pBrushBlack->CreateSolidBrush(RGB(0,0,0));
 //以下为在全局函数中获得从cFormView类继承来的应用程序
 //窗口中获得静态文本框控件绘图环境的代码
 //首先获得应用程序主窗口指针(用它进行绘制时绘制区域包括菜单条、工具条等)
 CWnd* pMainWnd=AfxGetMainWnd();
 //然后获得系统视图工作区窗口指针
 CWnd* pClient=pMainWnd->GetWindow(GW_CHILD);
 //再获得视图区中的相应控件子窗口的指针
 CWnd* pData=pClient->GetDlgItem(IDC_DATA_ON_TIME_thread);
 //最后获得相应控件子窗口的绘图环境
 CDC* pDC=pData->GetDC();
 //完成此操作后,就可以利用pDC指针进行绘图操作了
 BOOL runThread=TRUE;
 //绘制线程循环结束标志,其值为FALSE时退出线程
 while(runThread) //循环执行,直到结束事件到来
  {
  //此处加入绘制曲线的函数体,可以直接采用定时器实现方法时的绘制代码
//  CWnd* pWnd=pClient->GetDlgItem(IDC_DATA_ON_TIME_thread);//undeclared identifier???添加pClient->及_thread是否正确
  //获取绘制坐标的文本框
//  CDC* pDC=pWnd->GetDC();
  //选中蓝色画笔,并保存以前的画笔
  CGdiObject* pOldPen=pDC->SelectObject(pPenBlue);
  static int count_T=0;//记录格线的移动次数
  pDC->SetBkColor(RGB(0,0,0));//以下代码为绘制纵向格线
  for(int i=0;i<=60;i+=5)
  //画横向格线,每隔50个像素点的距离画一条
  {
   pOldPen=pDC->SelectObject(pPenBlue);
   pDC->SetBkColor(RGB(0,0,0));
   pDC->MoveTo(i*10,0);
   pDC->LineTo(i*10,400);
   pDC->SelectObject(pOldPen);
  }

  for(i=0;i<=40;i+=2)
  //画横向格线,每隔50个像素点的距离画一条
  {
   pOldPen=pDC->SelectObject(pPenRed);
   pDC->SetBkColor(RGB(0,0,0));
   pDC->MoveTo(0,i*10);
   pDC->LineTo(600,i*10);
   pDC->SelectObject(pOldPen);
  }
 
  if(pLinePoints>=2)//用背景色重绘原曲线,使之产生动画效果
  {
   pOldPen=pDC->SelectObject(pPenBlack);
   pDC->Polyline(polyline,pLinePoints);
   pDC->SelectObject(pOldPen);
  }
  //以上为重绘即擦掉原曲线
  static int col=0; //用来计算当前数据曲线各点的值
  int m_OnData;
  char mC[40];

  //用来存放当前需要显示的实时数据值
  if(col<61)
  {
   for(int j=0;j<=col;j++)
   polyline[j].x=600-(col-j)*10;
   //给数据曲线各点横坐标赋值
   m_OnData=abs(rand()) 0;
   //利用随机数模拟实际需要显示的实时数据
   polyline[col].y=m_OnData;
   col++;
   pLinePoints++;
  }
  else //if(col>=31)即当数组装满时顺次前移,将数组第一个元素丢掉
  {
   pLinePoints=61;
   for(int t=0;t<60;t++)
    polyline[t].y=polyline[t+1].y;
   //横坐标已经在第一次循环中放好故不需再改变
   //m_Ondata存放需要显示的实时数据。
   
   m_OnData=abs(rand()) 0;
   polyline[60].y=m_OnData;
   //数组最后一个元素始终存放当前最新实时数据
  }
  itoa(m_OnData,mC,10);
  pDC->SetBkColor(RGB(230,230,230));
  //设置显示文本的背景颜色
  pDC->TextOut(610,35,"实时数据");
  if(pLinePoints>=2)
  //当有两个或以上有效数据点时开始画动态数据曲线
  {
   pOldPen=pDC->SelectObject(pPenGreen);
   //选择新画笔并保存系统原先的画笔
   pDC->Polyline(polyline,pLinePoints); //绘制动态实时数据曲线
   pDC->SetTextColor(RGB(0,250,0));
   //用数字显示实时数据值,颜色与实时曲线相同
   pDC->TextOut(610,60,mC);
   pDC->SetTextColor(RGB(0,0,0));
   //恢复原来系统显示文字的字体颜色
   pDC->SelectObject(pOldPen);//恢复系统原先画笔
  }
  //检查是否有结束事件发来
  int retCode=::WaitForSingleObject(EndPaintLine.m_hObject,0);
  if(retCode==WAIT_OBJECT_0)
  runThread=FALSE;
  //如有结束事件发来,则修改runThread退出循环
//  ::Sleep(TimeSpan_GetData);
  ::Sleep(100);  //时间间隔可由TimeSpan_GetData来确定
  //采集绘制实时数据曲线的时间间隔
  } //endwhile
 //删除已经创建的画笔
 delete pPenRed;
 delete pPenBlue;
 delete pPenGreen;
 delete pPenBlack;
 delete pPenBKcolor;
 delete pBrushBlack;
 return 0;//线程必须有一返回值
}

 

void CProjectView::OnDataLine()
{
 //启动工作线程并画出绘制动态曲线的子窗口的背景矩形框
 CBrush* pBrushBlack=new CBrush;  //添加是否正确
 pBrushBlack->CreateSolidBrush(RGB(0,0,0));  //添加是否正确
 CWnd *pWnd=GetDlgItem(IDC_DATA_ON_TIME_thread);
 //获取绘制曲线文本框窗口指针
 CDC *pDC=pWnd->GetDC();
 CGdiObject *pOldBrush=pDC->SelectObject(pBrushBlack);
 pDC->Rectangle(0,0,600,400);
 //用黑色绘制显示动态数据曲线的子窗口
 pDC->SelectObject(pOldBrush);
 CWinThread *pThreadDataOnTime=AfxBeginThread(DataLineThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);//启动绘图线程
  
}

void CProjectView::OnEndDataLine()
//通过全局事件变量通知绘图线程结束绘制
{
 EndPaintLine.SetEvent(); 
}

void CProjectView::OnPaint()
{
 CBrush* pBrushBlack=new CBrush;  //添加是否正确
 CPen* pPenRed=new CPen;
 CPen* pPenBlue=new CPen;
 pBrushBlack->CreateSolidBrush(RGB(0,0,0));  //添加是否正确
 pPenRed->CreatePen(PS_DOT,1,RGB(150,0,0));
 pPenBlue->CreatePen(PS_DOT,1,RGB(10,150,255));
 CPaintDC dc(this); // device context for painting
 //以下代码为绘出画实时曲线的背景子窗口
 CWnd *pWnd=GetDlgItem(IDC_DATA_ON_TIME_thread);
 //获取绘制曲线的文本框指针
 pWnd->Invalidate();
 pWnd->UpdateWindow();
 CDC *pDC=pWnd->GetDC();
 CGdiObject *pOldBrush=pDC->SelectObject(pBrushBlack);
 CGdiObject *pOldPen=pDC->SelectObject(pPenRed);
 pDC->Rectangle(0,0,600,400);//绘制画曲线的矩形区域
 
  for(int i=0;i<=60;i+=5)
  //画横向格线,每隔50个像素点的距离画一条
  {
   pOldPen=pDC->SelectObject(pPenBlue);
   pDC->SetBkColor(RGB(0,0,0));
   pDC->MoveTo(i*10,0);
   pDC->LineTo(i*10,400);
   pDC->SelectObject(pOldPen);
  }
  //绘制横纵坐标刻度值
  for(i=0;i<=60;i+=5)
  {
   CString strX;
   strX.Format(_T("%d"),i/5);//int值转为字符
   pDC->SetBkColor(RGB(230,230,230));
   pDC->TextOut(i*10-5,405,strX);
  }

  for(i=0;i<=40;i+=2)
  //画横向格线,每隔50个像素点的距离画一条
  {
   pOldPen=pDC->SelectObject(pPenRed);
   pDC->SetBkColor(RGB(0,0,0));
   pDC->MoveTo(0,i*10);
   pDC->LineTo(600,i*10);
   pDC->SelectObject(pOldPen);
  }
  //绘制纵坐标刻度值
  for(i=20;i<=40;i++)
  {
   CString strY;
   strY.Format(_T("%d"),i);//int值转为字符
   pDC->SetBkColor(RGB(230,230,230));
   pDC->TextOut(-20,390-(i-20)*20,strY);
  }
 pDC->SelectObject(pOldBrush); 
 // Do not call CFormView::OnPaint() for painting messages
}

VC++适时动态曲线绘制并打印及预览,有一定的参考价值 VC++适时动态曲线绘制并打印及预览,源码包包含一个DLL组件的源代码,本程序可适时生成统计曲线,并预览、载入外部数据、存盘、打印图形等功能,程序还是有一定参考价值的, 测试无错,欢迎各位下载学习。 源码目录结构图: 部分源码展示(由于源码比较多,所以就不在此全部展示,需要的可以私信me): 我是小白程序员欧阳沐,欢迎关注我,带你一起长知识。您的关注便是我每日不断更新... 阅读详情

相关推荐

VC++ MFC曲线绘制:从GDI+原理到交互式数据可视化实现

在Windows桌面应用开发中,图形绘制是核心基础技术,涉及设备上下文、坐标映射等关键概念。其原理是通过图形设备接口将数据转换为屏幕像素,实现可视化表达,技术价值在于为工业控制、科学计算等场景提供高性能数据展示方案。应用场景广泛,包括实时波形显示、监控系统趋势图等。本文聚焦于VC++ MFC环境,深入探讨利用GDI+实现平滑曲线绘制,并涵盖双缓冲绘图优化和交互功能开发,解决动态数据可视化中的常见性能与交互问题。

weixin_42545503的博客 288

c++绘制极坐标曲线-使用Allegro绘图库

曲线绘制使用的allegro5图形图像库很简单,它的2d功能类似MFC的GDI绘图,对于函数平面曲线都是采样曲线上的点连成多段线对曲线逼近,下面两个程序都是极坐标下的曲线,一个是阿基米德螺旋线,一个是cos曲线. curve0.cpp 阿基米德螺旋线 #include <stdio.h> #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h> #include <vector&gt

baidu_38227555的博客 1789

图解VC++绘制数学曲线

工具: http://blog.youkuaiyun.com/bcbobo21cn/article/details/44200205 demo工程: http://pan.baidu.com/s/1kVEkDnT 1 新建单文档MFC exe 工程 2 添加菜单和菜单的消息处理函数 3 按下图代码运行,啥也没画出来; 下断点

bcbobo21cn的专栏 1万+

Visual C++6.0实现动态曲线4种方法

[编程学习]Visual C++6.0实现动态曲线4种方法网上资源newqiang 发表于 2006-3-9 11:30:31    在实验和生产中,我们常常需要对被监测的对象进行实时监控,比如对现场的温度等环境因素进行实时数据采集,然后传输到主控制计算机,以动态曲线的方式显示出来,便于人们对现场的了解和控制。 2.用Visual C++实现动态曲线的绘制有4种方法。(1)使用消隐。(2)使用

飞天小筑 3335

使用VC++绘制坐标系

首先打开VC++,新建一个单文档应用程序; 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色; 在菜单中添加如下菜单; 为菜单添加消息处理函数;添加在View类中; 在View类头文件中添加三个成员变量; int zbtype; //坐标系类别 int w,h; //存储窗口宽和高 int w2,h

bcbobo21cn的专栏 1万+

VC++实现沿正弦曲线动态移动的实心圆GUI应用程序

在Windows操作系统中,消息驱动是一种事件驱动编程模型,消息映射是MFC(Microsoft Foundation Classes)框架中实现事件处理的核心机制。当应用程序运行时,它通过窗口过程函数(Window Procedure)来响应各种事件,如鼠标点击、按键、定时器超时等。MFC将消息映射到相应的消息处理函数上,开发者不需要直接编写窗口过程函数。MFC通过宏和类结构实现消息映射机制,例如,消息处理宏ON_COMMANDON_MESSAGE等。

weixin_33670640的博客 833

测绘程序设计基础 实验6 CSU

测绘程序设计基础 实验6 CSU 实验6 图形程序设计 一、 实验目的 二、实验内容与要求 三、设计与实现: 3.1 设计思路: 3.2 界面设计及属性: 3.3主要代码: 3.4运行结果 3.5设计技巧: 代码虽多,不要贪杯~

一青的博客 2900

实现Microsoft VC++单文档多视图动态切换技术

单文档多视图架构是一种在应用程序中实现数据展示与交互的流行模式。它允许多个视图显示同一个数据源,从而提供更灵活的用户体验和更丰富的交互方式。在本章节中,我们将了解其基本概念、优点和使用场景。Microsoft Visual C++ (简称VC++) 是微软公司推出的一个集成开发环境,它最早出现在1993年作为Visual Studio的一部分。VC++ 是一个强大的C++编译器,它集成了代码编辑、构建、调试等多个开发环节,极大地便利了C++开发者。

weixin_42613360的博客 389

用VC++在单文档界面中创建多视图

一个单文档界面中存在多个视图,并且可以根据需要进行视图的动态切换,这是当前比较流行的界面风格,它可以满足许多用户在操作和显示方面的需要。这种界面风格的主要代表软件是Outlook Express。而用VC++实现这种风格的界面有一定难度,笔者就这个问题进行了研究,并归纳总结出两种实现方法(这些代码都在VC++ 6.0下调试通过),使用时关键注意步骤和实现思路,不必拘泥于代码的形式。  方法一:静态

cqfz123的专栏 3849

VC++视图中五种线条绘制技术实战详解

设备上下文本质上是一个包含绘图环境信息的数据结构,由操作系统维护。每个DC关联一个特定的输出设备,例如显示器、打印机或内存位图。应用程序不能直接访问该结构,而是通过Windows提供的HDC(句柄)进行操作。CDC类的作用就是将这个HDC包装成一个C++对象,提供类型安全和面向对象的操作方式。例如,在视图类的函数中,参数pDC即指向当前窗口客户区的有效设备上下文。开发者可以使用该指针调用各种绘图方法:"));上述代码会在坐标(10,10)处输出字符串。

weixin_29859471的博客 1152

VC++绘制曲线图趋势图

C++ 曲线图 双缓冲绘图 区域图 柱形图 内存图片的保存 共同学习,资源共享

单文档程序中动态切换多个窗体

在单文档程序中动态切换多个窗体         摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多个窗体的切换。    一、   引言    我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是对话框模式,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同的窗体,如作为数据库前台应用程序就会遇到此类问题,

xiaozhuyao123的专栏 452

vc画动态曲线图

VC环境下 画动态曲线图 的源码。 可以用来修改成画曲线的代码。

在VC++单文档程序中动态切换多个窗体切换

<br />在单文档程序中动态切换多个窗体   <br />  <br />  摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多个窗体的切换。 <br /><br />  一、   引言 <br /><br />  我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是对话框模式,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同的窗体,如作为数据库前台应用程序就会遇到此类问题,数据库由大量的表单组成,而同常一个窗体内只用来显示一

sddi1989的专栏 1446

Android HWC硬件合成器实战:从SurfaceFlinger到显示驱动的完整流程解析

本文深入解析Android HWC硬件合成器从SurfaceFlinger到显示驱动的完整流程,揭示HWC如何优化图形性能并降低功耗。通过实战案例和调试技巧,帮助开发者掌握硬件加速的图层混合技术,提升移动设备的显示效率。

gaochao的博客 494

ros2的unity仿真配置(ros2-for-unity)

可以看到unity中输出了Hello World,验证完毕!可以看到unity上监听的/chatter。

m0_63671696的博客 4093

在单文档程序中动态切换多个窗体(附图)

操作系统:Windows 7软件环境:Visual Studio 2008 SP1本次目的:在单文档程序中动态切换多个窗体      此文章转自网上,本人在最新的2008 SP1试验通过,现将步骤(转帖)和过程图片(本人自己截图)记录如下。 Normal 0 7.8 磅 0 2 false false

无幻 5486

[前沿技术] AMD FSR 1.0源码解析:EASU算法实现细节与优化策略

本文深入解析了AMD FSR 1.0技术的核心——EASU(边缘自适应空间升频)算法。通过剖析其源码,详细阐述了EASU如何利用12-tap采样窗口、基于Lanczos滤波器的多项式近似以及自适应的边缘检测机制,在无需AI模型的情况下实现高质量图像放大。文章重点揭示了其极致的GPU优化策略,包括寄存器利用、采样优化和避免动态分支,为理解高性能图形算法提供了绝佳范例。

docker7nomad的博客 540
上一篇: VC++中全局变量的问题
下一篇: 基于对话框的简单双缓冲绘图框架
swping
博客等级 码龄20年 10粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值