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 回答