我编了一个程序:当鼠标在窗体内部时会有一个圆圈跟随.编译运行都可以.就是鼠标移动时圆圈除了跟随移动同时闪烁不停,何解?如何消除这种闪烁现象?
各位如果知道就帮帮我吧!!!
谢谢! 

解决方案 »

  1.   

    不好意思,以下是主要代码:
    ....
    //先在CMoveballView中声明protected变量int x;int y;并在构造函数中初始化为-100
    void CMoveballView::OnDraw(CDC* pDC) //在OnDraw中画这个跟随鼠标移动的圆
    {
    CMoveballDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CPen Pen;
    Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0));
    CBrush Brush;
    Brush.CreateSolidBrush(RGB(225,225,0));
    pDC->SelectObject(Pen);
    pDC->SelectObject(Brush);
    pDC->Ellipse(x-50,y-50,x+50,y+50);//半径为50
    }
    ...
    void CMoveballView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    x=point.x;
    y=point.y;
    Invalidate(); //更新圆的位置
    CView::OnMouseMove(nFlags, point);
    }
    ...
      

  2.   

    Invalidate()引起系统的重绘,系统会先帮你重新填充窗口背景色,再绘制该圆,就会闪烁,你把绘图代码移动OnMouseMove中试下。最号先用背景色填充,再绘制跟踪圆
      

  3.   

    void CMoveballView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    x=point.x;
    y=point.y;
    Invalidate(); //<---这样肯定会闪烁,因为你把View里的东西包括背景
    //全部先删除,再重新画了一遍。
    CView::OnMouseMove(nFlags, point);
    }
    你可以用橡皮筋的技术来实现你跟踪鼠标移动的圆。
    大致是先用异或画一个以前画的圆来擦除原先的圆,再正常画当前的圆。
      

  4.   

    cayw(天行者) 提出的方法当然可以解决一些简单的移动问题(比如背景是单一颜色),但如果我的背景是一幅位图之类比较复杂的东西,画一个以前画的圆来擦除原先的圆应该比较麻烦吧?
    不知道有没有解决这类问题的一个比较好的方法?
      

  5.   


    双缓冲:void CMoveballView::OnDraw(CDC* pDC) //在OnDraw中画这个跟随鼠标移动的圆
    {
    CMoveballDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CPen Pen;
    Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0));
    CBrush Brush;
    Brush.CreateSolidBrush(RGB(225,225,0)); CDC dcMem;
    CBitmap bm;
    CRect rc;
    GetClientRect(&rc);
    dcMem.CreateCompatibleDC(pDC);
    bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    dcMem.SelectObject(&bm);       dcMem.SelectObject(Pen);
    dcMem.SelectObject(Brush);
    dcMem.Ellipse(x-50,y-50,x+50,y+50);//半径为50         pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);          dcMem.DeleteDC();
    bm.DeleteObject();
    }
      

  6.   

    MEMDC最常用的地方就是防止DC在绘制图形时出现闪烁的问题,Invalidate()函数是在屏幕上绘图,不停的重复绘制,图形的轨迹形成了闪烁的问题,使用MEMDC是在内存中画图,屏幕上没有图形轨迹,闪烁的问题自然就不存在了。