我在一个显示了图片视图上画了一个圆,并在圆的中间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);
//移动图元函数,其思想是先将原图元删除,再在移动后的位置画图元
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);
请给个详细的说明或者例子,谢谢了
这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东西从左画到右的情况。
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
}每次在内存中绘图好,再贴到屏幕上