矩形你是根据鼠标的down与up来定的吧,你在up时再画矩形啊,应该只是你没处理好

解决方案 »

  1.   

    两个办法,1. 鼠标按下时,你把矩形可能覆盖的区域用PrintWindow复制到内存memDC , 然后在Move事件中先画memDC再画矩形.  如果闪的话就用双缓冲.2. 记录你上次画过矩形的区域, 调用InvalidateRect让窗体重绘一下这个区域,然后画下一个举行. (最好只让窗体重绘矩形对应的四条线).
      

  2.   


    void CAlphaWindowDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    m_ptDown = point;
    m_rcPrev.SetRect(0, 0, 0, 0);
    SetCapture();
    }void CAlphaWindowDlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
    ClearRect(NULL);
    ReleaseCapture();
    }void CAlphaWindowDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
    if(nFlags & MK_LBUTTON)
    {
    CRect rc;
    rc.SetRect(
    min(point.x, m_ptDown.x),
    min(point.y, m_ptDown.y),
    max(point.x, m_ptDown.x),
    max(point.y, m_ptDown.y)
    );
    ClearRect(&rc);
    }
    }
    void CAlphaWindowDlg::ClearRect(LPRECT lpRect)
    {

    if(!m_rcPrev.IsRectNull())
    {
    CRgn rgn1, rgn2, rgn3, rgn4;
    rgn1.CreateRectRgn(m_rcPrev.left, m_rcPrev.top, m_rcPrev.right, m_rcPrev.top+1);
    rgn2.CreateRectRgn(m_rcPrev.left, m_rcPrev.bottom-1, m_rcPrev.right, m_rcPrev.bottom);
    rgn3.CreateRectRgn(m_rcPrev.left, m_rcPrev.top, m_rcPrev.left+1, m_rcPrev.bottom);
    rgn4.CreateRectRgn(m_rcPrev.right-1, m_rcPrev.top, m_rcPrev.right, m_rcPrev.bottom);
    rgn1.CombineRgn(&rgn1, &rgn2, RGN_OR);
    rgn1.CombineRgn(&rgn1, &rgn3, RGN_OR);
    rgn1.CombineRgn(&rgn1, &rgn4, RGN_OR);
    RedrawWindow(NULL, &rgn1);
    }

    if(!lpRect || ::IsRectEmpty(lpRect))
    {
    return;
    }
    CClientDC dc(this);
    dc.DrawFocusRect(lpRect);
    m_rcPrev = *lpRect;
    }
      

  3.   

    二楼GuttyFish:
    用双缓冲和内存画图之后,不闪屏了,也没矩形了,但是没有矩形框变化大小的那个过程,只能最后闪烁一次啊
      

  4.   


    这个是正解,又简单,效果又好,MSDN里还有源码例子
      

  5.   

    你需要的可能就是所谓的“橡皮圈”功能。可以学习《跟我学VISUAL C++6.0》中第10章中的相关内容。
    例程下载: http://download.csdn.net/download/wxhxj0268/5074690