2014-01-16 2 views
0

Как следовать код, я хочу использовать mpDC нарисовать перекрестную линию на точки мыши, когда я двигаю мышь, крест линия сдвинется с моей точки мыши,MFC сделать перекрестную линию, используя OnMouseMove

но, возможно, Я не знаю, использование 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); 
} 

Текущая ситуация картина enter image description here

но этот код будет использовать много перекрестную линию, когда сдвигать расположение мыши,

Как очистить предыдущий перекрестную линию ...

+0

где вы разместили свой код чертежа? – michaeltang

+0

Я поместил свой код в OnMouseMove – user1753112

ответ

0

ключевой момент, чтобы сделать это без использования растрового изображения - cdc-> SetROP2 (R2_NOT). , и вы должны записать точку для последнего чертежа. Я стараюсь, чтобы проверить его с помощью следующих шагов, надежда поможет

  1. определяют CPoint m_lastPoint в C ** Вид

  2. Initilize m_lastPoint = CPoint (-100, -100) в C ** view construct function

  3. Добавить функцию OnMouseMove для сообщения WM_MOUSEMOVE или другого сообщения, которое вы хотите добавить.

    CDC * 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; 
    
+0

К сожалению, код не работает [Как этот снимок для результата] (https://www.dropbox.com/s/ou9nq93mvtt8adw/a.png) – user1753112

+0

@ user1753112 Я не думаю SetROP2 (R2_NOT) является правильным, так как он является инверсией цвета экрана. Попробуйте SetROP2 (R2_WHITE) просто проверить (это не идеально, поскольку он стирает линии сетки). –

+0

Ни в коем случае, я не могу изменить цвет на белый, потому что у меня есть другая кривая в фоновом режиме ... – user1753112

0

Хорошо, нашли ответ для вас, который не использует BitBlt на основе ответа micaheltang в: При рисовании линии, первый вызов 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_XUsOvLYXStAa054H4Cw&ved=0CCoQ6AEwAA#v=onepage&q=MFC%20blending%20line%20with%20background&f=false под линейным смешением. При стирании линии используется тот же режим, и он должен восстановить предыдущий цвет.

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); 

крест линия будет перепрошить, но не держать в экране, как установил ее.

+0

Вы не храните старую точку, как показал вам micaheltang, а вместо этого вы просто рисуете, а затем стираете одни и те же поперечные линии (вы используете одни и те же точки). Вам нужно использовать его код, но только изменить R2_NOT на RT_XORPEN –

+0

Удалось ли вам это исправить? –