新人求问,MFC如何让对话框的绘图擦除

fangwy8820 2016-07-01 03:43:24
做了这样一个小界面,读取相应的TXT文档中的数据,作出曲线图,但是现在碰到这样一个问题。画第一次时没问题,但是当我想画条曲线时,第一次的曲线还在,无法擦除。

第一次是成功的,

擦除之后是这样的

再画第二次是这样的。。。。
擦除的按钮的内容是这样的
this->Invalidate();
this->UpdateWindow();
void Invalidate( BOOL bErase = TRUE );
。怎么办,有没有办法解决,求大神教我
...全文
682 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangwy8820 2016-07-04
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
在打开文件后添加清除原来的点数据的代码

File.Open(m_GetFilePath,CFile::modeRead);

while(m_ptrarray.GetSize())
{
  delete m_ptrarray[0];
  m_ptrarray.RemoveAt(0);
}
……
谢谢大神,解决了,这问题搞了我好久,小白我还是缺少基础知识啊
boylafong 2016-07-04
  • 打赏
  • 举报
回复
用双缓存画,不然调用刷新函数会闪烁
zgl7903 2016-07-04
  • 打赏
  • 举报
回复
在打开文件后添加清除原来的点数据的代码

File.Open(m_GetFilePath,CFile::modeRead);

while(m_ptrarray.GetSize())
{
  delete m_ptrarray[0];
  m_ptrarray.RemoveAt(0);
}
……
fangwy8820 2016-07-04
  • 打赏
  • 举报
回复
引用 2 楼 wjm1990 的回复:
OnPaint 里面的函数贴出来啊
贴出来了,求指导
fangwy8820 2016-07-04
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
那得看你是怎么画的,数据结构是什么。 一般来说是在OnPaint消息响应函数里画,需要进行逻辑控制每次刷新时画还是不画。 Invalidate(); UpdateWindow();只是让窗口响应一次WM_PAINT而执行OnPaint而已。
我的绘图代码不是写在OnPaint中的,就直接写在了按钮的响应函数中, void CMy_Class::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CRect rect; CWnd *pWin = GetDlgItem(IDC_DRAW);//获取该控件的指针,就可以对该控件直接操作了 pWin->GetClientRect(rect);//把控件的长宽、坐标等信息保存在rect里 int width=rect.Width();//可以获取宽和高 int height=rect.Height(); CString str; CDC *pDc = pWin->GetDC();//获取该控件的画布 //有了画布,下面可以自由的画图了,想怎么画就怎么话, pDc->Rectangle(rect); CBrush myBrush; myBrush.CreateSolidBrush(RGB(255,255,255)); //pDc->FillRect(rect,&myBrush); //CString strc; CString m_GetFilePath; char TempStr1[10]; char TempStr2[10]; char X1[10]; char X2[10]; char Y1[10]; char Y2[10]; memset(TempStr1,'\0',10); memset(TempStr2,'\0',10); memset(X1,'\0',10); memset(X2,'\0',10); memset(Y1,'\0',10); memset(Y2,'\0',10); m_GetFilePath="C:\\Users\\03010216\\Desktop\\PIC0\\PIC0\\"; m_GetFilePath+=neirong; CStdioFile File; File.Open(m_GetFilePath,CFile::modeRead); CString FileData; //定义一个CString变量作为缓冲区 File.ReadString(FileData);//读取第一行数据,第一行数据为x坐标范围 sscanf(FileData,"%s %s",X1,X2); m_x.x=atoi(X1); m_x.y=atoi(X2); File.ReadString(FileData);//读取第2行数据,第2行数据为y坐标范围 sscanf(FileData,"%s %s",Y1,Y2); m_y.x=atoi(Y1); m_y.y=atoi(Y2); do { File.ReadString(FileData); sscanf(FileData,"%s %s",TempStr1,TempStr2); if(FileData=="") break; m_Data.x=atoi(TempStr1); m_Data.y=atoi(TempStr2); CDate *pdata=new CDate(m_Data,m_x,m_y); m_ptrarray.Add(pdata); }while(1); m_nRepaint=1; rect.DeflateRect(30,30); int gridx=10; int gridy=10; double dx=rect.Width()/gridx; double dy=rect.Height()/gridy; CRect gridRect(rect.left,rect.top,rect.left+(int)dx*gridx,rect.top+(int)dy*gridy); CPen pen,penxi,penge; penxi.CreatePen(PS_SOLID,3,RGB(0,0,0)); penge.CreatePen(PS_DOT ,1,RGB(0,0,255)); double x_left=0.0,x_right=0.0,y_top=0.0,y_bottom=0.0; for(int i=0;i<m_ptrarray.GetSize();i++) { x_left=min(((CDate*)m_ptrarray.GetAt(i))->m_nData.x,x_left); x_right=max(((CDate*)m_ptrarray.GetAt(i))->m_nData.x,x_right); y_bottom=min(((CDate*)m_ptrarray.GetAt(i))->m_nData.y,y_bottom); y_top=max(((CDate*)m_ptrarray.GetAt(i))->m_nData.y,y_top); } //画坐标 CPen*oldPen=pDc->SelectObject(&penxi); pDc->MoveTo(gridRect.left,gridRect.bottom ); pDc->LineTo(gridRect.right,gridRect.bottom); pDc->MoveTo(gridRect.left,gridRect.bottom); pDc->LineTo(gridRect.left,gridRect.top); double datadx1=gridRect.Width()/((CDate*)m_ptrarray.GetAt(1))->m_nXScope.y; double datady1=gridRect.Height()/((CDate*)m_ptrarray.GetAt(1))->m_nYScope.y; double datadx=gridRect.Width()/10.0; double datady=gridRect.Height()/10.0; //表刻度 oldPen=pDc->SelectObject(&penxi); CString t; double Xper=(((CDate*)m_ptrarray.GetAt(1))->m_nXScope.y- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/10.0; double Yper=(((CDate*)m_ptrarray.GetAt(1))->m_nYScope.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/10.0; for(int a=0;a<=10;a++) { pDc->MoveTo(gridRect.left+a*(int)datadx,gridRect.bottom); pDc->LineTo(gridRect.left+a*(int)datadx,gridRect.bottom-5); t.Format("%.0f",(a*Xper+((CDate*)m_ptrarray.GetAt(0))->m_nXScope.x)); pDc->TextOut(gridRect.left+a*(int)datadx,gridRect.bottom+10,t); pDc->MoveTo(gridRect.left,gridRect.bottom-a*(int)datady); pDc->LineTo(gridRect.left+5,gridRect.bottom-a*(int)datady); t.Format("%.0f",(a*Yper+((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)); pDc->TextOut(gridRect.left+10,gridRect.bottom-a*(int)datady,t); } //画网格 oldPen=pDc->SelectObject(&penge); for(int k=1;k<=10;k++) { pDc->MoveTo(gridRect.left+k*(int)datadx,gridRect.bottom); pDc->LineTo(gridRect.left+k*(int)datadx,gridRect.top); pDc->MoveTo(gridRect.left,gridRect.bottom-k*(int)datady); pDc->LineTo(gridRect.right,gridRect.bottom-k*(int)datady); } //描点 oldPen=pDc->SelectObject(&penxi); switch(m_nDotType) { case 0: break; case 1: for( m=0;m<m_ptrarray.GetSize();m++) { pDc->Rectangle((int)(gridRect.left+(((CDate*)m_ptrarray.GetAt(m))->m_nData.x- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/Xper*datadx-3), (int)(gridRect.bottom-(((CDate*)m_ptrarray.GetAt(m))->m_nData.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/Yper*datady-3), (int)(gridRect.left+(((CDate*)m_ptrarray.GetAt(m))->m_nData.x- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/Xper*datadx+3), (int)(gridRect.bottom-(((CDate*)m_ptrarray.GetAt(m))->m_nData.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/Yper*datady+3)); } break; case 2: for(int c=0;c<m_ptrarray.GetSize();c++) { pDc->Ellipse((int)(gridRect.left+(((CDate*)m_ptrarray.GetAt(c))->m_nData.x- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/Xper*datadx-3), (int)(gridRect.bottom-(((CDate*)m_ptrarray.GetAt(c))->m_nData.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/Yper*datady-3), (int)(gridRect.left+(((CDate*)m_ptrarray.GetAt(c))->m_nData.x- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/Xper*datadx+3), (int)(gridRect.bottom-(((CDate*)m_ptrarray.GetAt(c))->m_nData.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/Yper*datady+3));; } break; } //画曲线 switch(m_nColorType) { case 0: pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); break; case 1: pen.CreatePen(PS_SOLID,1,RGB(0,0,0)); break; case 2: pen.CreatePen(PS_SOLID,1,RGB(0,255,0)); break; } oldPen=pDc->SelectObject(&pen); for(int j=0;j<(m_ptrarray.GetSize()-1);j++) { pDc->MoveTo((int)(gridRect.left+(((CDate*)m_ptrarray.GetAt(j))->m_nData.x- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/Xper*datadx), (int)(gridRect.bottom-(((CDate*)m_ptrarray.GetAt(j))->m_nData.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/Yper*datady)); pDc->LineTo((int)(gridRect.left+(((CDate*)m_ptrarray.GetAt(j+1))->m_nData.x- ((CDate*)m_ptrarray.GetAt(1))->m_nXScope.x)/Xper*datadx), (int)(gridRect.bottom-(((CDate*)m_ptrarray.GetAt(j+1))->m_nData.y- ((CDate*)m_ptrarray.GetAt(1))->m_nYScope.x)/Yper*datady)); } pen.DeleteObject(); penxi.DeleteObject(); penge.DeleteObject(); }
zgl7903 2016-07-02
  • 打赏
  • 举报
回复
可能是你的从文件读取数据的的时候 ,没有清空之前的数据吧?
vcf_reader 2016-07-02
  • 打赏
  • 举报
回复
把第一次的数据重新画一遍,用底色!这就相当于擦除了
wjm1990 2016-07-01
  • 打赏
  • 举报
回复
肯定原来打开的数据没有清空
wjm1990 2016-07-01
  • 打赏
  • 举报
回复
OnPaint 里面的函数贴出来啊
sdghchj 2016-07-01
  • 打赏
  • 举报
回复
那得看你是怎么画的,数据结构是什么。 一般来说是在OnPaint消息响应函数里画,需要进行逻辑控制每次刷新时画还是不画。 Invalidate(); UpdateWindow();只是让窗口响应一次WM_PAINT而执行OnPaint而已。

15,979

社区成员

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

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