0

画像コントロール上でマウスをドラッグしてユーザーに四角形を描画させようとしている MFC アプリケーションがあります。CStatic によってサブクラス化された独自の PictureCtrl クラスを作成しました。ただし、マウスをクリックしても OnLButtonUp() が起動しません。

void PictureCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
    SetCapture();

    anchor = point;
    CRect rect(point,point);

    CDC* pDC = GetDC();
    pDC->DrawDragRect(&rect, CSize(1,1), NULL, CSize(1,1), NULL, NULL);
    m_lastRect = rect;
    ReleaseDC(pDC);

    CStatic::OnLButtonDown(nFlags, point);

}

void PictureCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
    if(GetCapture() == this) 
    {
        CRect rect(anchor, point);
        rect.NormalizeRect();

        CDC *pDC = GetDC();
        pDC->DrawDragRect(&rect, CSize(1,1), &m_lastRect, CSize(1,1), NULL, NULL);
        m_lastRect = rect;
        ReleaseDC(pDC);

        ReleaseCapture();
    }

    CStatic::OnMouseMove(nFlags, point);
}

void PictureCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
    if(GetCapture() == this) 
    {
        CDC *pDC = GetDC();
        CRect rect(0,0,0,0);
        pDC->DrawDragRect(rect, CSize(1,1), &m_lastRect, CSize(1,1), NULL, NULL);
        ReleaseDC(pDC);

        ReleaseCapture();
    }

    CStatic::OnLButtonUp(nFlags, point);
}

OnLButtonUp が起動しない理由について誰かが私に洞察を与えることができれば、それはありがたいです。マウスをドラッグすると、OnMouseMove がすべての呼び出しを使い果たしているためですか?

また、長方形が既に描画されている場合、ユーザーが新しい長方形を描画すると古い長方形が削除されるように、コードを変更する方法について誰かが提案してもらえますか?

4

2 に答える 2

2

マウスがウィンドウの外にある場合は、ReleaseCapture()中に入ってはOnMouseMoveいけません。OnLButtonUp長方形に関しては、長方形が完成したらドラッグしない通常の描画プリミティブを使用してください。

于 2013-06-20T13:54:35.260 に答える
0

古い四角形を削除してから新しい四角形を描くには、独自の色を持たないが既存の画像ピクセルを反転させる特別なペンを使用します。次に、古い四角形を描画すると、それが消去されます。ここで WM_MOUSEMOVE の例を参照してください。

http://msdn.microsoft.com/en-us/library/windows/desktop/dd145184(v=vs.85).aspx

于 2013-06-20T14:11:38.960 に答える