用橡皮筋法在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;
}
[最优解释]
用双缓冲, 另外鼠标移动消息中是如何处理的?
[其他解释]
用双缓冲 然后再贴上去
[其他解释]
这种闪烁问题的标准解法就是双缓冲呀,全部贴图好后再贴到绘图区域的HDC中。
当然减少不必要的计算也是解决闪烁问题的重要方法。
[其他解释]
闪烁是个很大的范畴,双缓存只是个理念,且只能解决一部分问题。
得从根本上理解闪烁,才会有对症下药的方法。
[其他解释]
都在上班呢?
[其他解释]
下面的是在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;
}
[其他解释]
该回复于2012-11-30 13:17:08被管理员删除
[其他解释]
http://download.csdn.net/detail/dahaii0/4753715
参考这个例子
[其他解释]
是的,还是用双缓冲画,可以解决闪烁问题,即使是简单的GDI画矩形
双缓冲并不影响性能,一样很快的
[其他解释]
//创建内存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);