Chinaunix首页 | 论坛 | 博客
  • 博客访问: 368048
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:40:05

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);
}

--------------------next---------------------

再说一个编程风格的问题
m_variable 应该表示的是成员变量吧
作者的临时变量也是用"m_"开头. ( hurri2000 发表于 2005-11-2 17:22:00)
 
一般来说,数据采集的显示方式不是这样的。从左向
右显示,显示满了清空,从头开始。就相当与拿只笔从左向右画信号线,画满了,重新开始画。我想应该用多线程
编程,一个线程采集,一个线程显示,还要做到不闪烁,
哪位大侠能给个实例程序。 ( hurri2000 发表于 2005-11-2 14:41:00)
 
为什么我把这个程序改到基于formview的单文档MFC程序中时,内存泄露的问题又出现了。怎么解决,谢谢~! ( rayking 发表于 2005-8-22 23:07:00)
 
很好,不错的文章,受益非浅 ( ikohl 发表于 2005-6-18 22:23:00)
 
谢谢!
好人! ( samhoust 发表于 2005-6-3 16:49:00)
 
我是作者,感谢大家的宝贵意见,尤其感谢successq!

我现在一边攻读硕士,一边在公司兼职做课题,比较忙,但我会尽快抽时间添加打印功能和实现任意地方绘制!

封装成一个MFC扩展类! ( superlamster 发表于 2005-2-7 18:48:00)
 
文章写的很好,很实用。免得我们满世界乱找!谢谢了 ( dingliangbo 发表于 2004-11-26 9:21:00)
 
successq:有内存泄漏的问题。
如果将定时器的时间设置成为1毫秒触发一次的话,WINDOWS2000下中监视任务管理器就可以看初内存是不断增加的。98下面会出错。
解决方法应该再TIMER中加上
pWnd->ReleaseDC(pDC);
(发表于2004-8-25 15:23:00)
感谢原文作者,同样感谢纠正这个Bug的作者,我在使用这个绘图方式为我的程序添加数据采集的显示,但是一开始严重占用内存,我的实验采集要连续几个小时,可是原来不到10分钟就报错了,现在好了!太感谢了!
痛哭流涕状!:~。( ( SQuest 发表于 2004-11-20 10:26:00)
 
单从教育新人的角度向来讲是很有脾益的.但是放在2004年作为一篇教程是比较"那个"的. ( ice_think 发表于 2004-10-25 18:57:00)
 
有内存泄漏的问题。
如果将定时器的时间设置成为1毫秒触发一次的话,WINDOWS2000下中监视任务管理器就可以看初内存是不断增加的。98下面会出错。
解决方法应该再TIMER中加上
pWnd->ReleaseDC(pDC); ( successq 发表于 2004-8-25 15:23:00)
 
.......................................................

--------------------next---------------------

阅读(200) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~