如何在CDC :: OnDraw()中重新绘制?

时间:2013-09-30 06:54:59

标签: winapi visual-c++ mfc gdi

我想更新窗口(删除上一张图)并使用x2,y2的新值重绘。我从相机得到x2和y2,它们是手坐标,我想根据手坐标的新值绘制椭圆。我怎么能这样做?

我试图调用Invalidate(),RedrawWindow()和UpdateWindow(),但它们似乎都不起作用。以下是我的一大块代码。

     int x2,y2 // Global Variables (used to store coordinates of the hand)
     void GesturePipe()
      {
         x2=Hand.Coordinate.x;
         y2=Hand.Coordinate.y;

         // I get x2,y2 from a camera
      }


     void CLesson1View::OnDraw(CDC* pDC)
     {
    while(1)
      {
        GesturePipe();
        CLesson1Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
    return;
        COLORREF colorCircle= RGB(255,0,0); 
        pDC->Ellipse(0,0,(int) x2,(int) y2);
       //I intend to draw the skeleton of the hands so i would draw five lines,which  will get updated with each frame
        Invalidate(TRUE);
        UpdateWindow();

}

}

1 个答案:

答案 0 :(得分:1)

  1. 永远不要将UpdateWindow放在OnDraw或OnPaint中。这将导致递归!
  2. 如果您希望窗口反映新内容,则必须在识别更改的函数中调用Invalidate。 Invalidate将导致调用新的OnDraw循环... 因此,当识别出新手势时,获取它,为您的doc / view调用Invalidate设置新值。
  3. 你的Ondraw上有一个无限循环。这样做可以防止从队列中抽取其他Windows消息并执行。所以你的程序是阻止的。
  4. 也许您应该首先阅读一些标准教程,了解Windows输入和绘图的工作原理。