0

如下代码,我想用mpDC在鼠标点上画一条十字线,当我移动鼠标时,十字线会随着我的鼠标点移动,

但也许我不知道 BitBlt 的用法,所以我在绘制区域(rectRange)中看不到任何线条,

    CWnd *pWnd;
    CRect rect;
    CDC mShowDC;
    CBitmap mShowBmp;
    CPen mpen;
    CPen *mOldpen;

    CDC *mpDC;

    mpDC = GetDC();

    mShowDC.CreateCompatibleDC(mpDC);
    mShowBmp.CreateCompatibleBitmap(mpDC,rectRange.Width(),rectRange.Height());
    mShowDC.SelectObject(mShowBmp);

    BitBlt(mShowDC,0,0,rectRange.Width(),rectRange.Height(),
        mbkCurveDC,0,0,SRCCOPY);

    //InvalidateRect(rectRange);
    if(boolShowMouseLine)
    {
        mpen.CreatePen(PS_SOLID,1,RGB(0,0,0));
        mOldpen = mShowDC.SelectObject(&mpen);

        mShowDC.MoveTo(rectRange.left,mMousePoint.y);
        mShowDC.LineTo(mMousePoint.x - 1,mMousePoint.y);

        mShowDC.MoveTo(mMousePoint.x + 1,mMousePoint.y);
        mShowDC.LineTo(rectRange.bottom,mMousePoint.y);

        mShowDC.MoveTo(mMousePoint.x,rectRange.top);
        mShowDC.LineTo(mMousePoint.x,mMousePoint.y - 1);

        mShowDC.MoveTo(mMousePoint.x,mMousePoint.y + 1);
        mShowDC.LineTo(mMousePoint.x,rectRange.right);

        mpen.DeleteObject();
        mShowDC.SelectObject(mOldpen);
    }

    mpDC->BitBlt(rectRange.left, rectRange.top,
        rectRange.Width(), rectRange.Height(), 
        &mShowDC, rectRange.left, rectRange.top, SRCCOPY);

我绘制交叉线的另一种方法如下代码

 CDC *cdc;
cdc = GetDC();

if(boolShowMouseLine)
{
    cdc->MoveTo(rectRange.left,mMousePoint.y);
    cdc->LineTo(mMousePoint.x - 1,mMousePoint.y);

    cdc->MoveTo(mMousePoint.x + 1,mMousePoint.y);
    cdc->LineTo(rectRange.right,mMousePoint.y);

    cdc->MoveTo(mMousePoint.x,rectRange.top);
    cdc->LineTo(mMousePoint.x,mMousePoint.y - 1);

    cdc->MoveTo(mMousePoint.x,mMousePoint.y + 1);
    cdc->LineTo(mMousePoint.x,rectRange.bottom);
}

目前的情况就是图片在此处输入图像描述

但是这个代码在移动鼠标位置时会画很多交叉线,

如何清除上一个交叉线...

4

3 回答 3

0

不使用位图的关键点是 cdc->SetROP2(R2_NOT)。你应该记录最后一张图的点。我尝试通过以下步骤对其进行测试,希望对您有所帮助

  1. 在 C**view 中定义 CPoint m_lastPoint

  2. 在 C**view 构造函数中初始化 m_lastPoint = CPoint(-100,-100)

  3. 为消息 WM_MOUSEMOVE 或您要添加的其他消息添加 OnMouseMove 函数。

    疾病预防控制中心 *cdc; cdc = GetDC();

    CPoint mMousePoint = point;
    
    CRect rectRange;//(0,0,500,500);
    GetClientRect(&rectRange);
    
    if(m_lastPoint.x >= 0 && m_lastPoint.y >= 0)
    {
        cdc->SetROP2(R2_NOT);
        mMousePoint = m_lastPoint;
        cdc->MoveTo(rectRange.left,mMousePoint.y);
        cdc->LineTo(mMousePoint.x - 1,mMousePoint.y);
    
        cdc->MoveTo(mMousePoint.x + 1,mMousePoint.y);
        cdc->LineTo(rectRange.right,mMousePoint.y);
    
        cdc->MoveTo(mMousePoint.x,rectRange.top);
        cdc->LineTo(mMousePoint.x,mMousePoint.y - 1);
    
        cdc->MoveTo(mMousePoint.x,mMousePoint.y + 1);
        cdc->LineTo(mMousePoint.x,rectRange.bottom);
    }
    cdc->SetROP2(R2_BLACK);
    mMousePoint=point;
    cdc->MoveTo(rectRange.left,mMousePoint.y);
    cdc->LineTo(mMousePoint.x - 1,mMousePoint.y);
    
    cdc->MoveTo(mMousePoint.x + 1,mMousePoint.y);
    cdc->LineTo(rectRange.right,mMousePoint.y);
    
    cdc->MoveTo(mMousePoint.x,rectRange.top);
    cdc->LineTo(mMousePoint.x,mMousePoint.y - 1);
    
    cdc->MoveTo(mMousePoint.x,mMousePoint.y + 1);
    cdc->LineTo(mMousePoint.x,rectRange.bottom);
    m_lastPoint = mMousePoint;
    
于 2014-01-16T07:37:50.533 回答
0

我使用以下代码

CClientDC dc(this);
int oldmode=dc.SetROP2(R2_NOTXORPEN);
        COLORREF color;

        color = RGB(0,0,0);

        CPen pen(PS_DASH, 2, color), *oldpen;
        oldpen = dc.SelectObject(&pen);

        dc.MoveTo(rectRange.left, mMousePoint.y);
        dc.LineTo(mMousePoint.x - 1, mMousePoint.y);

        dc.MoveTo(mMousePoint.x + 1, mMousePoint.y);
        dc.LineTo(rectRange.right, mMousePoint.y);

        dc.MoveTo(mMousePoint.x, rectRange.top);
        dc.LineTo(mMousePoint.x, mMousePoint.y - 1);

        dc.MoveTo(mMousePoint.x, mMousePoint.y + 1);
        dc.LineTo(mMousePoint.x, rectRange.bottom);

        PEndPoint = point;

        dc.MoveTo(rectRange.left, mMousePoint.y);
        dc.LineTo(mMousePoint.x - 1, mMousePoint.y);

        dc.MoveTo(mMousePoint.x + 1, mMousePoint.y);
        dc.LineTo(rectRange.right, mMousePoint.y);

        dc.MoveTo(mMousePoint.x, rectRange.top);
        dc.LineTo(mMousePoint.x, mMousePoint.y - 1);

        dc.MoveTo(mMousePoint.x, mMousePoint.y + 1);
        dc.LineTo(mMousePoint.x, rectRange.bottom);

        dc.SelectObject(oldpen);
        dc.SetROP2(oldmode);
        ReleaseDC(&dc);

十字线会重新闪烁,但没有保留在屏幕上,如何修复它。

于 2014-01-17T01:28:50.393 回答
0

好的,根据 miaheltang 的回答为您找到了一个不使用 BitBlt 的答案:画线时,首先调用 cdc->SetROP2(R2_XORPEN); 如此处所述http://books.google.co.il/books?id=eDvx4Qx63b0C&pg=PA105&lpg=PA105&dq=MFC+blending+line+with+background&source=bl&ots=v3ycFSlHL7&sig=agpZHLBgnocSXZLQ6qSM6nWFIzM&hl=en&sa=X&ei=wZ_HAAUsOvLYXStA065#&vLYXStA065 =onepage&q=MFC%20blending%20line%20with%20background&f=false在线条混合下。擦除线条时使用相同的模式,它应该恢复以前的颜色。

于 2014-01-16T09:04:02.673 回答