我用ontimer实现一个绘图函数。如果图像坐标在ontimer函数中改变,ondraw函数中绘图,图像不能动了。
如果在ontimer中修改一个变量,在ondraw中用这个变量去修改图像坐标,图像就能动了。
求问如何在ontimer中修改图像坐标也能让图像动起来。  多谢各位大牛!!!

解决方案 »

  1.   

    估计是图像坐标在ontimer函数中改变后,而函数ondraw函数绘图没有执行(也即没有WM_PAINT)消息
    修改下,如果图像坐标在ontimer函数中改变了,则直接调用函数InvalidateRect使窗体接受
    WM_PAINT消息,进行绘图。
      

  2.   

    在ontimer函数里边,InvalidateRect图片的坐标。
      

  3.   

    就是在ontimer末尾加上InvalidateRect函数
    确认下“图像坐标在ontimer函数中改变后“
    在ondraw中能用上图像坐标改变的值吗
    是不是图像坐标定义成全局的才合适?
      

  4.   

    我一般是这样实现的:
    在OnTimer在生成重画消息,在OnDraw中重画。
      

  5.   

    坐标是定义为全局了,我把画图函数加到ontimer里才行,如果画图函数在ondraw里,InvalidateRect也不好使,不知道为啥
      

  6.   

    InvalidateRect后加句updatewindow试试..另是不是InvalidateRect参数有没有设置正确
      

  7.   

    >>坐标是定义为全局了,我把画图函数加到ontimer里才行,如果画图函数在ondraw里,InvalidateRect也不好使,不知道为啥
    为了确定问题的原因,可以增加些调试信息
    1.先确定下ontimer 里 增加了InvalidateRect 函数后,是否使ondraw函数运行了
     在 ontimer  函数里的InvalidateRect 后 增加TRACE("InvalidateRect\n");
    2.然后在ondraw里增加
      TRACE("OK\n");
    3.按 F5 调试运行程序 就可以输出的信息,大体可以推断出问题的所在
    如果上述测试表明InvalidateRect没起作用则
    在InvalidateRect 后再增加 UpdateWindow函数强制发送WM_PAINT消息
      

  8.   

    终于搞好了,在ontimer中改坐标,ondraw中画出来。
    我加上了用键盘上下左右来控制图像坐标的平移,但是ontimer里不响应,不知道为啥,代码如下,请各位大神指点一下。void CSnakeView::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    int i=0;
    if(yFlag==1)
    {
    //水平运动 for(i=0; i<snakeCount-1;i++)
    {
    snakePoint[i].x=snakePoint[i+1].x;
    snakePoint[i].y=snakePoint[i+1].y;
    }
    snakePoint[snakeCount-1].x=snakePoint[snakeCount-1].x+xFlag*50;
    snakePoint[snakeCount-1].y=snakePoint[snakeCount-1].y;
    }
    else
    {
    //上下运动 for(i=0; i<snakeCount-1;i++)
    {
    snakePoint[i].x=snakePoint[i+1].x;
    snakePoint[i].y=snakePoint[i+1].y;
    }
    snakePoint[snakeCount-1].x=snakePoint[snakeCount-1].x;
    snakePoint[snakeCount-1].y=snakePoint[snakeCount-1].y+xFlag*50;
    }
    snakeStep++; InvalidateRect(CRect(-1500, -1200, 1200, 1500)); CView::OnTimer(nIDEvent);
    }
    void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(nChar){ 
      case VK_DOWN:
      xFlag=-1;
    yFlag=-1; Invalidate() ;
    break;
      case VK_UP:
    xFlag=1;
    yFlag=-1; Invalidate() ;
    break;
      case VK_LEFT:
    xFlag=-1;
    yFlag=1;
    Invalidate() ;
    break;
      case VK_RIGHT:
    xFlag=1;
    yFlag=1;
    Invalidate() ;
    break;   default:;
    Invalidate() ;
    break;
    }

    CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }
      

  9.   

    请问onkeydown中如何传递消息给ontimer ?  直接修改全局变量的话好像传递不过去