我在对话框上安了一个图像控件,然后再图像控件上装载了一张800X600的位图作背景,现在要实现红色圆点在图像控件背景图上移动,用一般的方法可以实现,但圆点有闪动,用双缓存,怎么也实现不了,大家帮帮忙。

解决方案 »

  1.   

    用双缓冲,背景和前景都要绘制到内存位图上。如果不想这样,可以用InvalidateRect来缩小背景刷新的区域(旧的位置),在新的区域绘制圆点。
      

  2.   

    感谢Mackz(在相互)的答复,按照你的说话作如下修改:
    m_pBitmap->LoadBitmap(IDB_BITMAP1); //把IDB_BITMAP1是背景图
    CBitmap *pOldBitmap = m_pMemoryDC->SelectObject(m_pBitmap);// 把背景图装载到内存DC
    m_pMemoryDC->Ellipse (X,Y,X+20,Y+20);//画圆
    刷子加不进去,画出来的圆,边框是黑色,里面是白色,怎么办
      

  3.   

    什么叫“刷子加不进去”,没看到你使用画刷的代码啊?画刷要选入m_pMemoryDC中。
      

  4.   

    按照Mackz(在相互)的思路再次作如下修改,代码如下,能画出彩色圆,但还是闪动。不知到哪儿出了问题,Mackz帮忙看看。谢谢了。void CTUDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default 
       switch(nIDEvent)
       {
          case 1:
     {    CWnd* pWnd=GetDlgItem(IDC_PIC);    CDC *pDC=pWnd->GetDC();      pWnd->Invalidate();     pWnd->UpdateWindow();     CRect rectCtrl; 
                pWnd->GetClientRect(rectCtrl);      CDC *m_pMemoryDC=new CDC();     CBitmap *m_pBitmap=new CBitmap();     m_pMemoryDC->CreateCompatibleDC(pDC);     m_pBitmap->CreateCompatibleBitmap(pDC,rectCtrl.right,rectCtrl.bottom);
       CBitmap *pOldBitmap = m_pMemoryDC->SelectObject(m_pBitmap);// 
                //pDC所指的PIC控件里面已经装载了背景图,拷贝背景图到内存DC
       m_pMemoryDC->BitBlt(rectCtrl.left,rectCtrl.top,rectCtrl.right,
                             rectCtrl.bottom,pDC,0,0,SRCCOPY);   
                DrawCircle(m_pMemoryDC); //我的画圆函数,可以画出彩色圆了    pDC->BitBlt(rectCtrl.left,rectCtrl.top,rectCtrl.right,
                            rectCtrl.bottom,m_pMemoryDC,0,0,SRCCOPY);//画好了贴出来。    m_pMemoryDC->DeleteDC();    m_pBitmap->DeleteObject ();    delete m_pMemoryDC;    delete m_pBitmap;    pWnd->ReleaseDC(pDC);            
                break;
     }
          case 2:
              break;
          case 3:   
              break; 
        }
        CDialog::OnTimer(nIDEvent);
    }
    //我的画圆函数,其中CArray<CPoint,CPoint> m_ptArray 是全局变量,记录点坐标
     void CTUDlg::DrawCircle(CDC* pDC)
    {  
         CPen* pen = new CPen(PS_SOLID, 1, RGB(255, 0, 0));
         CPen* oldpen=pDC->SelectObject (pen); 
         CBrush* brush=new CBrush(RGB(255,0,0));
         CBrush *pOldbrush = pDC->SelectObject(brush);//  
         pDC->Ellipse (m_ptArray[0].x,m_ptArray[0].y,m_ptArray[0].x+5,
                       m_ptArray[0].y+5); 
         pDC->SelectObject (pOldbrush);
         pDC->SelectObject (oldpen);
         if (m_ptArray[0].x <200)
         {
      m_ptArray[0].x=m_ptArray[0].x +1; 
         }
         else
         {  
             m_ptArray[0].y =m_ptArray[0].y +1;
     if (m_ptArray[0].y >200) 
        KillTimer(1); 
         } 
         delete brush; 
         delete pen;
    }
      

  5.   

    删除掉
       pWnd->Invalidate();     pWnd->UpdateWindow();
      

  6.   

    问题已经解决,谢谢Mackz(在相互)