如何根据离散数据动态显示曲线波形
我们在处理数字信号的时候经常需要根据离散的数据显示波形,以下文字简述如何动态显示波形。
主要使用了Timer函数和双缓存技术。
主要步骤:
1. 设置Timer。
2. 在OnTimer中使用双缓存,在内存中画图。
主要程序如下:
f为频率参数,
A为幅度参数。
1. 首先在初始化函数中申请存储离散点的数组,本程序暂存储1024个点,使用正弦波数据。
void CLineView::OnInitialUpdate()
{
CView::OnInitialUpdate();
fArray = new float [W];
for( int i=0;i<W;i++ )
{
fArray[i] = (float)sin(i/f);
}
SetTimer(10,100,NULL);
}
2. 在OnTimer中使用memdc,在内存中画图,然后贴到设备dc上。
void CLineView::OnTimer(UINT nIDEvent)
{
if( tempNum < W - Num )
tempNum++;
else
tempNum=0;
CDC *pDC = GetDC();
CRect rect;
this->GetClientRect(&rect);
//内存绘图
CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
//memBitmap.LoadBitmap(IDB_BITMAP1);
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();
CView::OnTimer(nIDEvent);
}
产生波形函数如下:
void CLineView::DrawWave(CDC *pDC)
{
long i;
CRect rect;
CBrush brush( RGB(255,255,255) );
this->GetClientRect(&rect);
pDC->FillRect(&rect,&brush);
CPen* pPenRed = new CPen;// 创建画笔对象
pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));// 红色画笔
CPen* pPenBlue = new CPen;// 创建画笔对象
pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));// 蓝色画笔
CPen * pOldPen;
pOldPen = pDC->SelectObject(pPenBlue);
//原点坐标为(100,250)
pDC->MoveTo(80,250);
pDC->LineTo(600,250);
pDC->LineTo(590,255);
pDC->MoveTo(600,250);
pDC->LineTo(590,245);
pDC->MoveTo(100,400);
pDC->LineTo(100,100);
pDC->LineTo(95,110);
pDC->MoveTo(100,100);
pDC->LineTo(105,110);
CPoint * pList;
pList = new CPoint [Num];
pDC->SelectObject(pPenRed);
for( i=0;i<Num;i++ )
{
pList[i] = CPoint(100+i,250-(int)(fArray[tempNum+i]*A) );
}
for( i=0;i<Num;i++ )
{
pDC->PolyBezier(pList,Num);
}
pDC->SelectObject(pOldPen);
delete [] pList;
}
读者可以根据自己需要,动态设置波形数据,幅度频率等参数。
时间仓促,难免有误,望大家指正。
代码经调试通过,如需源程序请
http://www.life-abroad.com/bbs/dispbbs.asp?boardID=18&ID=39&page=1
如有问题请留言