本身两者没有关系,Ontimer是自己加进去的,你可以使用OnTimer触发的时候调用OnDraw而已
Ondraw函数 绘制不怕窗口覆盖的图
Ontimer函数 绘制临时显示的图, 重绘后会消失,(即,OnTimer主要是定时刷新或者临时性的绘制)
原则:ontimer是定时器,只控制参数变化并通知OnDraw进行局部更新,自己不重画。这样就没有冲突了。优化来说,“局部重绘”很关键。
OnDraw(pDC);
下面以一个具体的例子来说明:
代码如下:在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