VC实现波形不闪烁动态绘图

一、程序运行时波形效果


二、在信号处理中,通常需要把采集信号的实时波形显示出来。 如果直接在屏幕上动态绘图的话,会出现闪烁现象,为了克服这个问题,本文采用的就是先在内存绘图,然后再拷贝到屏幕,从而实现动态绘图而不闪烁。详细介绍如下:

2.1 首先在头文件中定义以下私有变量,并在对话框资源中放置一个picture控件

private:
CDC *pDC; //屏幕绘图设备
CDC memDC; //内存绘图设备
int m_High; //绘图起点
int m_Low; //绘图终点
int m_lCount[1024]; //数据存储数组
int m_now; //记录波形当前点

2.2 在实现文件中初始化变量,并设置定时器

BOOL CDrawTest::OnInitDialog()?
{
  CDialog::OnInitDialog();

  // TODO: Add extra initialization here
  m_Low = 0;
  m_High = 1024;
  m_now =0;
  SetTimer(1,100,NULL);

  return TRUE; // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE
}

2.3 在定时器里创建内存绘图设备,并调用绘图函数在内存设备中绘图,绘图完毕后把内存设备中图拷贝到屏幕

void CDrawTest::OnTimer(UINT nIDEvent)
{
  // TODO: Add your message handler code here and/or call default
  CRect rect;

  // 获取绘制坐标的文本框
  CWnd* pWnd = GetDlgItem(IDC_COORD);

  //获得对话框上的picture的窗口句柄
  pWnd->GetClientRect(&rect);
  // 指针
  pDC = pWnd->GetDC();
    pWnd->Invalidate();
  pWnd->UpdateWindow();

  //内存绘图
  CBitmap memBitmap;
  CBitmap* pOldBmp = NULL;

  //创建内存绘图设备
  memDC.CreateCompatibleDC(pDC);
  memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
  pOldBmp = memDC.SelectObject(&memBitmap);
  memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);

  //自定义绘图函数,详细见源程序
  DrawWave(&memDC);

  //把内存绘图拷贝到屏幕
  pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);

  memDC.SelectObject(pOldBmp);
  memDC.DeleteDC();
  memBitmap.DeleteObject();

  CDialog::OnTimer(nIDEvent);
}

本文配套源码

时间: 2024-08-30 21:19:01

VC实现波形不闪烁动态绘图的相关文章

mfc-用VS2010.。里MFC编程基于对话框动态绘图的问题

问题描述 用VS2010..里MFC编程基于对话框动态绘图的问题 主要是3个问题(注意是VS2010!!) 我初学MFC 我想要主要实现的功能是 在对话框里添加背景图 并在背景图上动态根据坐标画线,并且图和线都随着对话框大小的改变对应按比例改变..1.在我的绘图过程中 最后一段线 就是从N-1到N段 没有画出来 我这里取的是N=12段 共13个点,只有拖拽或者最大化对话框的时候才出现..:2.每当画完(不包括缺失的最后一段)时,会出现一个从原点到N-1点的直线(我本意的线可以从坐标点里看出),并

c语言-VC 6.0环境如何动态调用我这个dl,往高手指导l

问题描述 VC 6.0环境如何动态调用我这个dl,往高手指导l A.dll头文件导出函数声明如下: 开发环境VC++ 6.0 typedef void *TESTHANDLE; extern "C" __declspec(dllexport) int __stdcall TEST_Init(TESTHANDLE *hHandle); extern "C" __declspec(dllexport) int __stdcall TEST_Exit(TESTHANDLE

vc++-VC6如何在生成动态链结库的文件(DLL)里调用SQL2000

问题描述 VC6如何在生成动态链结库的文件(DLL)里调用SQL2000 VC6如何在生成动态链接库的文件(DLL)里调用SQL2000,最终该文件要用于VFP环境内, 也就是要在SET LIBARY TO XX.DLL里调用里的函数,该问题很是急,麻烦大侠们高抬贵 手! 解决方案 VC产生动态链接库以及调用sql server都不麻烦,只是看你vfp能不能调用了.你的具体问题是什么. 解决方案二: 生成标准windows DLL,用_stdcall调用约定来封装DLL的导出函数等. 解决方案三

vc中关于屏幕闪烁问题解决的小结

也许我们都碰到过这种情况,当你想重画某个窗口的时候,或你需要每隔一段时间要进行重画窗口,窗口会不停的闪烁.那么如何消除闪烁呢?借鉴了别人的经验,自己也总结一下,现将总结的几种方法介绍一下,供大家参考.1.将Invalidate()替换为InvalidateRect(). 因为Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所需时间会少一些.所以替换之后在很大程度上会减少闪烁.如果你确实需要改善闪烁的情况,计算一个

C++开发文章收藏

基础知识 C标准函数集锦 标准C I/O函数 sizeof  用法 正确使用内存 有关c++  string类 堆和栈的区别[再转] C++中的异常(exception) API总结和断点函数 字符集和编码知识 高位优先与低位优先 do...while(0)的妙用 理解虚基类.虚函数与纯虚函数的概念 C之修炼 C代码优化方案 C++代码优化方法总结 VC:CString用法整理(转载)  VC的若干实用小技巧  (如何干净的删除一个类) 指针 C++部分操作符 C++中const用法总结 VC定

VC无闪烁刷屏技术的实现【转】

转自:http://blog.csdn.net/scorpio_tiger/article/details/2888719   http://www.pconline.com.cn/pcedu/empolder/gj/vc/0507/653941.html   1.显示的图形为什么会闪烁 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的.当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色

VC++中动态生成菜单技巧

下载源代码 一.前言    在实际运用中,经常需要根据操作来增减菜单和菜单项.在VC++开发环境下,动态生成菜单的方法有多种.例如:可以利用资源编辑器创建菜单资源,然后在程序运行中动态加入菜单,这种动态生成菜单的方法比较常见,运用比较多.用这种方法动态增加菜单时,首先需要在Resource.h中添加菜单ID:由于是动态生成的菜单选项,所以要实现它的功能就不能在ClassWizard中映射函数了,需要在头文件中手动添加消息函数原型,在代码文件中手动添加消息映射和添加消息响应函数.动态生成菜单的另一

VC动态生成菜单项的实现方法_C 语言

本例所述为使用VC编写的一个可以动态生成菜单项的类文件,这里展示的是其核心代码,代码备有比较详细的注释,相对而言理解起来并不复杂. 主要功能代码如下: #include "stdafx.h" #include "Test.h" #include "TestDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序"关于"菜单项的 CAboutDlg 对话框 class

jQuery实现表格数据的动态添加与统计

某物流信息系统中的功能要求如图1.1所示,表格中每一行代表一笔运送货物的信息,在录入每行的计费重量和费率后,要求能按一定的公式,自动计算运送费用,并且能自动统计所有运送货物的总运费.运送货物信息的数据量(即表格的行数)不定,要求能动态增加.删除,即表格的数据行数是动态可维护的.同时为了方便操作,需要在页面中能像使用键盘的上下左右方向键,在录入的文本框之间进行切换.每行的数据有一定的校验要求,比如单号必须为8位数字,件数和重量必须为数字... 单行货物信息计算运费不难实现,只需要在计费重量和费率的