用橡皮筋法在OnMouseMove()中画矩形,矩形总闪
用橡皮筋法在OnMouseMove()中画矩形,不断的擦除和重绘,矩形总闪。
如果用双缓存的话,问题没有解决。
请问,有别的什么办法吗
if (m_iCurSelected == RECTANGLE)//画矩形
{
CBrush *pOldBrush;
if (m_fillColor != RGB(255, 255, 255))//当前有画刷选入
pOldBrush = pDC->SelectObject(&m_fillBrush);
else
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
int nOldDrawMode = pDC->SetROP2(R2_NOTXORPEN);
pDC->Rectangle(&m_rect);//擦掉上次绘的矩形
m_PointEnd = point;
SetRect(&m_rect, m_PointBegin.x, m_PointBegin.y, m_PointEnd.x, m_PointEnd.y);
pDC->Rectangle(&m_rect);
pDC->SetROP2(nOldDrawMode);
pDC->SelectObject(pOldBrush);
m_iPreSelected = RECTANGLE;
}
if (m_iCurSelected == RECTANGLE) //画矩形
{
CBrush *pOldBrush;
if (m_fillColor != RGB(255, 255, 255)) //当前有画刷选入
pOldBrush = pDC->SelectObject(&m_fillBrush);
else
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
int nOldDrawMode = pDC->SetROP2(R2_NOTXORPEN);
pDC->Rectangle(&m_rect); //擦掉上次绘的矩形
m_PointEnd = point;
SetRect(&m_rect, m_PointBegin.x, m_PointBegin.y, m_PointEnd.x, m_PointEnd.y);
pDC->Rectangle(&m_rect);
pDC->SetROP2(nOldDrawMode);
pDC->SelectObject(pOldBrush);
m_iPreSelected = RECTANGLE;
}
//创建内存DC
CRect rect;
GetClientRect(&rect);
CDC *pDC = GetDC();
CDC memDC;
CBitmap bitmap;
memDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
CBitmap *pOldBitmap = memDC.SelectObject(&bitmap);
CPen *pOldPen = memDC.SelectObject(&m_pen);
memDC.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY);
//根据选项,开始画图
if (m_iCurSelected == RECTANGLE)//画矩形
{
CBrush *pOldBrush;
if (m_fillColor != RGB(255, 255, 255))//当前有画刷选入
pOldBrush = memDC.SelectObject(&m_fillBrush);
else
pOldBrush = (CBrush*)memDC.SelectStockObject(NULL_BRUSH);
int nOldDrawMode = memDC.SetROP2(R2_NOTXORPEN);
memDC.Rectangle(&m_rect);//擦掉上次绘的矩形
m_PointEnd = point;
SetRect(&m_rect, m_PointBegin.x, m_PointBegin.y, m_PointEnd.x, m_PointEnd.y);
memDC.Rectangle(&m_rect);
memDC.SetROP2(nOldDrawMode);
memDC.SelectObject(pOldBrush);
m_iPreSelected = RECTANGLE;
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldPen);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
ReleaseDC(pDC);