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);
}
但是当程序处于非顶层窗口时,波形会消失。(窗口重绘)