VC画波形图

hdfhjfgdh 2009-01-07 09:56:42
我要编写一个小软件,读取信号并显示信号波形。我的做法是:创建基于对话框的应用程序,主对话框类假设为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);
}
但是当程序处于非顶层窗口时,波形会消失。(窗口重绘)
...全文
1025 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2009-01-08
  • 打赏
  • 举报
回复
你这个rect是谁的变量?是CImageWnd的吧,怎么能在对话框类的构造函数中赋值?这个坐标应该是CImageWnd窗口的客户区坐标啊。一句话,在CImageWnd::OnPaint()中:GetClientRect( rect );即可。
hdfhjfgdh 2009-01-08
  • 打赏
  • 举报
回复
我是在主对话框类的构造函数中赋值的,代表的是显示波形图的区域。
你说的“建议在OnPaint中用GetClientRect为其赋值”中OnPaint是哪个类的函数,CImageWnd还是CUltraSoundProcDlg主对话框类的?
菜牛 2009-01-07
  • 打赏
  • 举报
回复
你这个rect变量如何赋值?建议在OnPaint中用GetClientRect为其赋值。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧