mfc重绘问题

ybn187 2013-03-10 11:44:29
我要做的是点击按钮出现坐标图,是一个对话框程序,在刚打开程序时,出现的是一个空的坐标图,然后点击按钮,想让出现一副图像,绘图都在OnPaint里面写了,为了让点击按钮出现不同于初始的图,我设置了一个变量m_draw,初始值为0,点击按钮,值设为1,读取文件,设置坐标图轴下标值,调用OnPaint,出现曲线图,想法是这样的,现在不出曲线,求大神啊,网上有一些关于重绘的,看的不是太明白。
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybn187 2013-03-10
  • 打赏
  • 举报
回复
void CAaDlg::OnOK() 
{
	// TODO: Add extra validation here
	CFileDialog fileopendlg(true);
	if (fileopendlg.DoModal() == IDOK)
	{
		filename = fileopendlg.GetPathName();
	}
	m_draw=1;
	OnPaint()
	m_draw=0;
	//CDialog::OnOK();
}

void CAaDlg::OnPaint() 
{
	fstream file2;
	double t,x,y,z;
	double max_t,max_xa,max_xb;
	double xstep,ystep;
	CPaintDC dc(this); 
	fstream file1;
	CPen* pPenBlue = new CPen;                                  //创建画笔对象
	pPenBlue->CreatePen(PS_SOLID, 2, RGB(0,0,255));     //蓝色画笔
	CPen* pPenBlack = new CPen;                                 //创建画笔对象
	pPenBlack->CreatePen(PS_SOLID, 1, RGB(0,0,0)); //黑色画笔
	//选中黑色画笔,并保存当前画笔
	
	CGdiObject* pOldPen = dc.SelectObject(pPenBlack);
	 int i = 0;
	CString str;
	//绘制坐标系
	CPoint OPos(15,200),NowPos;
	 //绘制x坐标轴
	dc.MoveTo(OPos);     
	NowPos.x = 650;
	NowPos.y = 200;
	dc.LineTo(NowPos);
	 //绘制箭头
	dc.LineTo(645,195);
	dc.MoveTo(650,200);
	dc.LineTo(645,205);
	//dc.MoveTo(15,200);
	 
	for (i = 0;i < 11;i++)
	{
	 	dc.MoveTo(15+62*i,OPos.y);
	 	dc.LineTo(15+62*i,OPos.y - 5);
	} 
	//绘制y轴坐标系数
	dc.MoveTo(15,0);
	dc.LineTo(15,400);
	//绘制箭头
	dc.MoveTo(15,0);
	dc.LineTo(20,5);
	dc.MoveTo(15,0);
	dc.LineTo(10, 5);
	
	for (i = -9;i < 10;i++)
	{
		dc.MoveTo(15,OPos.y-20*i);
		dc.LineTo(20,OPos.y - 20*i);		
	}

	if (m_draw == 1)
	{

		file2.open(filename);
		file2>>t>>x;
		max_xa=x;
		max_xb=x;
		while(1)
		{
			if (file2.eof())
			{
				break;
			}
			file2>>t>>x;
			max_t=t;
			if (max_xa<x)
			{
				max_xa=x;
			}
			if (max_xb>x)
			{
				max_xb=x;
			}
		}
		//file2.seekg(0,ios::beg);
		xstep=(max_t/1000+1)*100;
		ystep=((max_xa-max_xb)/100+1)*5;
		for (i = 0;i < 11;i++)
		{
			dc.MoveTo(15+62*i,OPos.y);
			if (i % 2 == 0)
			{
				str.Format("%d",xstep*i);
				dc.TextOut(OPos.x +62*i-5,OPos.y+1,str);
			}
		}
		for ( i = -9;i < 10;i++)
		{
			dc.MoveTo(15,OPos.y-20*i);
			if (i % 2 != 0)
			{
				str.Format("%d",i*ystep);
				dc.TextOut(0,OPos.y-20*i-5,str);
			}
		}
		file2.close();
	}
	else
	{
		for (i = 0;i < 11;i++)
	 	{
	 		 dc.MoveTo(15+62*i,OPos.y);
	 		 if (i % 2 == 0)
			 {
	 			str.Format("%d",i);
	 			dc.TextOut(OPos.x +62*i-5,OPos.y+1,str);
			 }
	 		
		}
		for (i = -9;i < 10;i++)
		{
			dc.MoveTo(15,OPos.y-20*i);
			if (i % 2 != 0)
			{
				str.Format("%d",i);
				dc.TextOut(0,OPos.y-20*i-5,str);
			}	
		}
	}
}
ybn187 2013-03-10
  • 打赏
  • 举报
回复
这是点击按钮的处理程序 void CAaDlg::OnOK() { // TODO: Add extra validation here CFileDialog fileopendlg(true); if (fileopendlg.DoModal() == IDOK) { filename = fileopendlg.GetPathName(); } m_draw=1; /* CRect rectqx; GetDlgItem(IDD_AA_DIALOG)->GetWindowRect(&rectqx); ScreenToClient(rectqx); */ OnPaint() m_draw=0; //CDialog::OnOK(); } 下面是OnPaint: void CAaDlg::OnPaint() { fstream file2; double t,x,y,z; double max_t,max_xa,max_xb; double xstep,ystep; CPaintDC dc(this); fstream file1; CPen* pPenBlue = new CPen; //创建画笔对象 pPenBlue->CreatePen(PS_SOLID, 2, RGB(0,0,255)); //蓝色画笔 CPen* pPenBlack = new CPen; //创建画笔对象 pPenBlack->CreatePen(PS_SOLID, 1, RGB(0,0,0)); //黑色画笔 //选中黑色画笔,并保存当前画笔 CGdiObject* pOldPen = dc.SelectObject(pPenBlack); int i = 0; CString str; //绘制坐标系 CPoint OPos(15,200),NowPos; //绘制x坐标轴 dc.MoveTo(OPos); NowPos.x = 650; NowPos.y = 200; dc.LineTo(NowPos); //绘制箭头 dc.LineTo(645,195); dc.MoveTo(650,200); dc.LineTo(645,205); //绘制x轴坐标系数 //dc.MoveTo(15,200); for (i = 0;i < 11;i++) { dc.MoveTo(15+62*i,OPos.y); dc.LineTo(15+62*i,OPos.y - 5); } dc.MoveTo(15,0); dc.LineTo(15,400); //绘制箭头 dc.MoveTo(15,0); dc.LineTo(20,5); dc.MoveTo(15,0); dc.LineTo(10, 5); for (i = -9;i < 10;i++) { dc.MoveTo(15,OPos.y-20*i); dc.LineTo(20,OPos.y - 20*i); } if (m_draw == 1) { file2.open(filename); file2>>t>>x; max_xa=x; max_xb=x; while(1) { if (file2.eof()) { break; } file2>>t>>x; max_t=t; if (max_xa<x) { max_xa=x; } if (max_xb>x) { max_xb=x; } } //file2.seekg(0,ios::beg); xstep=(max_t/1000+1)*100; ystep=((max_xa-max_xb)/100+1)*5; for (i = 0;i < 11;i++) { dc.MoveTo(15+62*i,OPos.y); if (i % 2 == 0) { str.Format("%d",xstep*i); dc.TextOut(OPos.x +62*i-5,OPos.y+1,str); } } for ( i = -9;i < 10;i++) { dc.MoveTo(15,OPos.y-20*i); if (i % 2 != 0) { str.Format("%d",i*ystep); dc.TextOut(0,OPos.y-20*i-5,str); } } file2.close(); } else { for (i = 0;i < 11;i++) { dc.MoveTo(15+62*i,OPos.y); if (i % 2 == 0) { str.Format("%d",i); dc.TextOut(OPos.x +62*i-5,OPos.y+1,str); } } for (i = -9;i < 10;i++) { dc.MoveTo(15,OPos.y-20*i); if (i % 2 != 0) { str.Format("%d",i); dc.TextOut(0,OPos.y-20*i-5,str); } } } }
lingtianyulong 2013-03-10
  • 打赏
  • 举报
回复
能把代码贴出来吗,只是这样看,很难确定问题出在什么地方。或者,你可以单步执行一下,跟踪到函数里面看看是不是绘图的代码的问题
ybn187 2013-03-10
  • 打赏
  • 举报
回复
谢谢了,采用了上面俩个结合的方法,在点击处理函数里面就得到坐标轴步长,并存贮文件数据,最后用 Invalidate()来重绘
tycheng47 2013-03-10
  • 打赏
  • 举报
回复
double max_xa,max_xb; void CAaDlg::OnInitDialog() { m_draw=0; // 設定初值 max_xa=-9; max_xb=9; } void CAaDlg::OnButton1Clicked() { CFileDialog fileopendlg(true); fstream file2; if (fileopendlg.DoModal() == IDCANCEL)// OK才執行 return; filename = fileopendlg.GetPathName(); m_draw=1; //取得 max_xa,max_xb file2.open(filename); file2>>t>>x; max_xa=x; max_xb=x; while(1) { if (file2.eof()) { break; } file2>>t>>x; max_t=t; if (max_xa<x) { max_xa=x; } if (max_xb>x) { max_xb=x; } } file2.Clolsed(); //改變m_draw及max_ma,max_mb,OnPaint時不需重複開黨讀檔, Invalidate();//呼叫OnPaint(); } void CAaDlg::OnPaint() { double t,x,y,z; double max_t; double xstep,ystep; CPaintDC dc(this); fstream file1; CPen* pPenBlue = new CPen; //创建画笔对象 pPenBlue->CreatePen(PS_SOLID, 2, RGB(0,0,255)); //蓝色画笔 CPen* pPenBlack = new CPen; //创建画笔对象 pPenBlack->CreatePen(PS_SOLID, 1, RGB(0,0,0)); //黑色画笔 //选中黑色画笔,并保存当前画笔 CGdiObject* pOldPen = dc.SelectObject(pPenBlack); int i = 0; CString str; //绘制坐标系 CPoint OPos(15,200),NowPos; //绘制x坐标轴 dc.MoveTo(OPos); NowPos.x = 650; NowPos.y = 200; dc.LineTo(NowPos); //绘制箭头 dc.LineTo(645,195); dc.MoveTo(650,200); dc.LineTo(645,205); //dc.MoveTo(15,200); for (i = 0;i < 11;i++) { dc.MoveTo(15+62*i,OPos.y); dc.LineTo(15+62*i,OPos.y - 5); } //绘制y轴坐标系数 dc.MoveTo(15,0); dc.LineTo(15,400); //绘制箭头 dc.MoveTo(15,0); dc.LineTo(20,5); dc.MoveTo(15,0); dc.LineTo(10, 5); for (i = -9;i < 10;i++) { dc.MoveTo(15,OPos.y-20*i); dc.LineTo(20,OPos.y - 20*i); } if (m_draw == 1) { xstep=(max_t/1000+1)*100; ystep=((max_xa-max_xb)/100+1)*5; } else { xstep=1; ystep=1; } for (i = 0;i < 11;i++) { dc.MoveTo(15+62*i,OPos.y); if (i % 2 == 0) { str.Format("%d",xstep*i); dc.TextOut(OPos.x +62*i-5,OPos.y+1,str); } } for ( i = -9;i < 10;i++) { dc.MoveTo(15,OPos.y-20*i); if (i % 2 != 0) { str.Format("%d",i*ystep); dc.TextOut(0,OPos.y-20*i-5,str); } } }
菜牛 2013-03-10
  • 打赏
  • 举报
回复
OnPaint不是你去调用的,是窗口刷新产生了WM_PAINT消息后去调用的,所以其实每次刷新的时候m_draw都是0。 你可以在OnOK里面读取好数据,Invalidate窗口,在OnPaint里面判断有数据就根据数据绘图。 另外更好的方式是在OnOK里面读取好数据,绘制到后台一个位图中,在OnPaint中直接将这个位图绘制出来,这样效率高,无刷新,但是如果要有放大缩小移动等需要额外处理。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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