我在一个显示了图片视图上画了一个圆,并在圆的中间TextOut出了这个圆的序号,我对圆的移动采用了下面的方式,可是同种方法却不能正确的移动TextOut出的文字。圆用下面方法移动没问题,可是移动TextOut出的文字时,文字后跟了一串因为没有被正确删除而留下的印儿在图片上。请问我该怎么解决,也不知道我这个问题描述清楚没有。  
 
//移动图元函数,其思想是先将原图元删除,再在移动后的位置画图元  
COLORREF  XorColor=pDC->GetBkColor()^GetPenColor();  
CPen  pen(PS_SOLID,1,XorColor),  *Oldpen;  
int  oldmode=pDC->GetROP2();  
Oldpen=pDC->SelectObject(&pen);  
pDC->SetROP2(R2_XORPEN);  
CBrush*OldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);  
//删除圆  
pDC->Ellipse(m_x-r,m_y-r,m_x+r,m_y+r);  
//删除TextOut出的文字  
pDC->SetBkMode(TRANSPARENT);  
pDC->SetTextColor(XorColor);  
pDC->TextOut(m_x,m_y,m_serial);  
 
//之后是在鼠标移动的新位置上画圆...  
//这里的鼠标位置已经改变了,m_x,m_y也跟着改变了  
 
//在新的位置画圆  
pDC->Ellipse(m_x-r,m_y-r,m_x+r,m_y+r);  
//在新的位置TextOut出文字  
pDC->SetBkMode(TRANSPARENT);  
pDC->SetTextColor(m_pencolor);  
pDC->TextOut(m_x,m_y,m_serial);

解决方案 »

  1.   

    orbit
    请给个详细的说明或者例子,谢谢了
      

  2.   

    使用MemoryDC先在内存里把图画好,再复制到屏幕上。
    这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东西从左画到右的情况。
    void CMyWin::OnPaint() 
    {
    CPaintDC dc1(this); // device context for painting
    DcMemory.CreateCompatibleDC(&dc1);
    CBitmap bmp;
    //这里的Bitmap是必须的,否则当心弄出一个大黑块.
    Bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height());
    DcMemory.SelectObject(&bmp);
    //接下来你想怎么画就怎么画
    //dcMemory.FillRect(rectClient,&brush); 

    dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY);
    dcMemory.DeleteDC();
    // Do not call CWnd::OnPaint() for painting messages
    }每次在内存中绘图好,再贴到屏幕上