下面的是在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;
}

解决方案 »

  1.   

    http://download.csdn.net/detail/dahaii0/4753715
    参考这个例子
      

  2.   

    是的,还是用双缓冲画,可以解决闪烁问题,即使是简单的GDI画矩形
    双缓冲并不影响性能,一样很快的
      

  3.   


    //创建内存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);
      

  4.   

    这种闪烁问题的标准解法就是双缓冲呀,全部贴图好后再贴到绘图区域的HDC中。
    当然减少不必要的计算也是解决闪烁问题的重要方法。