怎样协调好MFC中ondraw与ontimer的关系

本身两者没有关系,Ontimer是自己加进去的,你可以使用OnTimer触发的时候调用OnDraw而已

Ondraw函数 绘制不怕窗口覆盖的图
Ontimer函数 绘制临时显示的图, 重绘后会消失,(即,OnTimer主要是定时刷新或者临时性的绘制


原则:ontimer是定时器,只控制参数变化并通知OnDraw进行局部更新,自己不重画。这样就没有冲突了。优化来说,“局部重绘”很关键



OnDraw在任何需要重绘的时候被自动调用,不需要你去主动调用这个函数。
OnTimer里面你只需要通知一下View:那一块需要更新了,系统自动调用OnDraw并且只更新那一块区域(当然,不声明区域就全部更新),
通知方法:InvalidateRect

Invalidate();
UpdateWindow();


或者在OnTimer里,主动调用OnDraw
CDC *pDC=GetDC(); //调用OnDraw(pDC)重画 

OnDraw(pDC); 


下面以一个具体的例子来说明:

利用MFC的SetTimer、OnTimer和OnDraw实现图形形变

每隔1秒钟画一次圆形、长方形、三角形
代码如下:在VIEW类定义成员变量,并初始化 ituxing=0;
CMy1_1View::CMy1_1View()
{
 // TODO: add construction code here
 ituxing=0;
}
void CMy1_1View::OnDraw(CDC* pDC)
{
 CMy1_1Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here

    //清除当前图形 

 CBrush mybrush1; 
 mybrush1.CreateSolidBrush(RGB(192,250,233)); 
 CRect myrect1(0,0,1024,768); 
 pDC->FillRect(myrect1,&mybrush1); 

 //判断当前图形ituxing 
 if(ituxing==1) 
 	//ituxing=1,画矩形 
 pDC->Rectangle(100,100,400,400); 
 else if(ituxing==2) 
	 //ituxing=2,画圆 
 pDC->Ellipse(20,20,89,89); 
 else 
 //否则,画三角形 
 { 
 pDC->MoveTo(100,100); 
 pDC->LineTo(189,145); 
 pDC->LineTo(100,189); 
 pDC->LineTo(100,100); 
 } 
}

void CMy1_1View::OnTimer(UINT nIDEvent)
{

 // TODO: Add your message handler code here and/or call default 
 //使ituxing循环 
 ituxing=(ituxing+1)%3; 
//获取指针pdc CDC *pDC=GetDC(); //调用OnDraw(pDC)重画 OnDraw(pDC); CView::OnTimer(nIDEvent); } int CMy1_1View::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here //设置更新时间 SetTimer(1, 1000, NULL); return 0; }
 
  
TIPS:

tuxing=(ituxing+1)%3;就是实现的ituxing从0到2的循环啊,才开始初始化为0,执行ituxing=(ituxing+1)%3后为1,在执行ituxing=(ituxing+1)%3后为2,在执行后又为0.

SetTimer(1, 1000, NULL); 这句话可以放在OnInitialUpdate()函数在中,
如果要放在OnCreate函数中的话,需要自己手动添加WM_CREATE的消息响应函数,系统会自动生成一个OnCreate
另外,OnTimer函数也可以用其他的方式引发窗口重绘,不一定要调用OnDraw函数


该程序做得好的一点就是

 //使ituxing循环 ituxing=(ituxing+1)%3; 
巧妙的在OnTimer函数中调用这句话,实现ituxing变量的自动变化,分别取值0,1,2



你可能感兴趣的:(怎样协调好MFC中ondraw与ontimer的关系)