VC画波形图
我要编写一个小软件,读取信号并显示信号波形。我的做法是:创建基于对话框的应用程序,主对话框类假设为ADlg,我在主对话框上留出一片区域用于显示波形,新建了一个基类为CWnd的类CImageWnd类,希望对波形的绘制操作ShowSignal()在该类中完成。但是,我在CImageWnd类的OnPaint()函数中无法使用自定义坐标系统,而如果把显示信号的操作ShowSignal放在ADlg类中却可以使用自定义坐标系统。为什么在CImageWnd类的OnPaint()函数中无法使用自定义坐标系统?
////////////////////////////////////////////
///////////下面的OnPaint()函数老是出错:
///////////////////////////////////////////
void CImageWnd::ShowSignal(int length, const void *lpShort)
{
DataLength=length;
if(Data) delete Data;
Data=new short[DataLength];
memcpy(Data,lpShort,DataLength);
Invalidate();
}
void CImageWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// CDC* pDC=GetDC();
// dc.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
// CDC* pDC=GetDC();
CBrush brush1;
brush1.CreateHatchBrush(HS_CROSS,RGB(128,128,128));
dc.SelectObject(&brush1);
dc.Rectangle(&rect);
brush1.DeleteObject();
short MaxData=FindAbsMaxData(Data,DataLength);//最大数据(十进制)
short Max=short(MaxData*1.1);
dc.SetMapMode(MM_ANISOTROPIC);//设置映射模式为MM_ANISOTROPIC
//设置窗口左上角的坐标为(0,Max)
// dc.SetWindowOrg(0,Max);
dc.SetWindowExt(DataLength,-2*Max);//设置窗口度量
/**/
dc.SetViewportOrg(0,0);//设置视口左上角的坐标
dc.SetViewportExt(rect.Width(),rect.Height());//设置视口度量
//创建蓝色实线画笔
CPen pen(PS_SOLID,1,RGB(0,0,255)),pen1(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&pen);//载入蓝色实线画笔
dc.MoveTo(0,0);
int x;
short *p;
for(x=0,p=Data;(x<DataLength) && (p<Data+DataLength);x++,p++)
{
dc.LineTo(x,*p);//绘制正半轴曲线
}
dc.SelectObject(&pen1);//载入红色实线画笔
dc.MoveTo(0,0);//绘制X轴
dc.LineTo(DataLength-1,0);
dc.MoveTo(0,-Max);//绘制Y轴
dc.LineTo(0,Max);
pen.DeleteObject();
pen1.DeleteObject();
// Do not call CWnd::OnPaint() for painting messages
}
///////////////////////////////////////////////////
//若在主对话框中使用自定义坐标系统,则能显示波形:
//////////////////////////////////////////
void CUltraSoundProcDlg::ShowSignal(long *lpLong, int length)
{
CDC *pDC=GetDC();
CBrush brush1;
brush1.CreateHatchBrush(HS_CROSS,RGB(128,128,128));
pDC->SelectObject(&brush1);
pDC->Rectangle(&rect);
brush1.DeleteObject();
lpLongSelected=lpLong;
SelectedLength=length;
MaxData=FindAbsMaxData(lpLong,length);
Max=long(MaxData*1.1);
pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式为MM_ANISOTROPIC
pDC->SetWindowOrg(0,Max);//设置窗口左上角的坐标为(0,Max)
pDC->SetWindowExt(length,-2*Max);//设置窗口度量
xWinExt=length;
yWinExt=-2*Max;
pDC->SetViewportOrg(20,20);//设置视口左上角的坐标
pDC->SetViewportExt(rect.Width(),rect.Height());//设置视口度量
CPen pen(PS_SOLID,1,RGB(0,0,255)),pen1(PS_SOLID,1,RGB(255,0,0));
pDC->SelectObject(&pen);//载入蓝色实线画笔
pDC->MoveTo(0,0);
int x;
long* p;
for(x=0,p=lpLong;(x<length) && (p<lpLong+length);x++,p++)
pDC->LineTo(x,*p);//绘制正半轴曲线
pDC->SelectObject(&pen1);//载入红色实线画笔
pDC->MoveTo(0,0);//绘制X轴
pDC->LineTo(length-1,0);
pen.DeleteObject();
pen1.DeleteObject();
ReleaseDC(pDC);
}
但是当程序处于非顶层窗口时,波形会消失。(窗口重绘)
////////////////////////////////////////////
///////////下面的OnPaint()函数老是出错:
///////////////////////////////////////////
void CImageWnd::ShowSignal(int length, const void *lpShort)
{
DataLength=length;
if(Data) delete Data;
Data=new short[DataLength];
memcpy(Data,lpShort,DataLength);
Invalidate();
}
void CImageWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// CDC* pDC=GetDC();
// dc.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
// CDC* pDC=GetDC();
CBrush brush1;
brush1.CreateHatchBrush(HS_CROSS,RGB(128,128,128));
dc.SelectObject(&brush1);
dc.Rectangle(&rect);
brush1.DeleteObject();
short MaxData=FindAbsMaxData(Data,DataLength);//最大数据(十进制)
short Max=short(MaxData*1.1);
dc.SetMapMode(MM_ANISOTROPIC);//设置映射模式为MM_ANISOTROPIC
//设置窗口左上角的坐标为(0,Max)
// dc.SetWindowOrg(0,Max);
dc.SetWindowExt(DataLength,-2*Max);//设置窗口度量
/**/
dc.SetViewportOrg(0,0);//设置视口左上角的坐标
dc.SetViewportExt(rect.Width(),rect.Height());//设置视口度量
//创建蓝色实线画笔
CPen pen(PS_SOLID,1,RGB(0,0,255)),pen1(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&pen);//载入蓝色实线画笔
dc.MoveTo(0,0);
int x;
short *p;
for(x=0,p=Data;(x<DataLength) && (p<Data+DataLength);x++,p++)
{
dc.LineTo(x,*p);//绘制正半轴曲线
}
dc.SelectObject(&pen1);//载入红色实线画笔
dc.MoveTo(0,0);//绘制X轴
dc.LineTo(DataLength-1,0);
dc.MoveTo(0,-Max);//绘制Y轴
dc.LineTo(0,Max);
pen.DeleteObject();
pen1.DeleteObject();
// Do not call CWnd::OnPaint() for painting messages
}
///////////////////////////////////////////////////
//若在主对话框中使用自定义坐标系统,则能显示波形:
//////////////////////////////////////////
void CUltraSoundProcDlg::ShowSignal(long *lpLong, int length)
{
CDC *pDC=GetDC();
CBrush brush1;
brush1.CreateHatchBrush(HS_CROSS,RGB(128,128,128));
pDC->SelectObject(&brush1);
pDC->Rectangle(&rect);
brush1.DeleteObject();
lpLongSelected=lpLong;
SelectedLength=length;
MaxData=FindAbsMaxData(lpLong,length);
Max=long(MaxData*1.1);
pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式为MM_ANISOTROPIC
pDC->SetWindowOrg(0,Max);//设置窗口左上角的坐标为(0,Max)
pDC->SetWindowExt(length,-2*Max);//设置窗口度量
xWinExt=length;
yWinExt=-2*Max;
pDC->SetViewportOrg(20,20);//设置视口左上角的坐标
pDC->SetViewportExt(rect.Width(),rect.Height());//设置视口度量
CPen pen(PS_SOLID,1,RGB(0,0,255)),pen1(PS_SOLID,1,RGB(255,0,0));
pDC->SelectObject(&pen);//载入蓝色实线画笔
pDC->MoveTo(0,0);
int x;
long* p;
for(x=0,p=lpLong;(x<length) && (p<lpLong+length);x++,p++)
pDC->LineTo(x,*p);//绘制正半轴曲线
pDC->SelectObject(&pen1);//载入红色实线画笔
pDC->MoveTo(0,0);//绘制X轴
pDC->LineTo(length-1,0);
pen.DeleteObject();
pen1.DeleteObject();
ReleaseDC(pDC);
}
但是当程序处于非顶层窗口时,波形会消失。(窗口重绘)
...全文
相关推荐
VC画波形图,二进制读写文件
环境下绘制波形图。
VC++波形图绘制实践代码
MFC(Microsoft Foundation Classes)是微软公司推出的一套用于C++开发Windows应用程序的类库。MFC封装了大量Windows API,并提供了一种面向对象的方式来构建Windows应用程序。它特别适用于开发本地Windows桌面应用程序,其中需要高效的UI和事件处理。MFC使用GDI(图形设备接口)进行图形绘制,支持丰富的控件和组件,可以方便地制作出复杂的用户界面。MFC的适用场景主要包括:- Windows桌面应用程序开发。
VC画波形图.txt
VC++ 绘制波形图的基础原理在 VC++ 中绘制波形图通常涉及使用 Windows 的 GDI(Graphics Device Interface)图形设备接口来实现。
用vc实现的播放声音,并画出波形的程序,没有错误,调试通过了
标题中的“用vc实现的播放声音,并画出波形的程序”指的是使用Microsoft Visual C++(简称VC)这个集成开发环境编写的程序,该程序能够播放音频文件并且实时地在屏幕上绘制出声音的波形图。
grape.zip_VC6.0ntgraph_grape_visual c_串口波形_读取串口数据
vc6.0 使用NTGraph控件 读取串口数据后画出波形图


图形处理/算法
