首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用橡皮筋法在OnMouseMove()中画矩形,矩形总闪,该怎么处理

2012-12-25 
用橡皮筋法在OnMouseMove()中画矩形,矩形总闪用橡皮筋法在OnMouseMove()中画矩形,不断的擦除和重绘,矩形总

用橡皮筋法在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);

热点排行