鼠标点击CStatic控件后OnLButtonUp不触发

OnLButtonUp not firing after mouse click for CStatic control

本文关键字:OnLButtonUp 控件 CStatic 鼠标      更新时间:2023-10-16

我有一个MFC应用程序,我试图让用户通过鼠标拖动在图片控件上绘制一个矩形。我创建了自己的PictureCtrl类的子类CStatic。然而,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正在吞噬所有的调用吗?

另外,谁能给我一个建议,如何修改我的代码,以便如果一个矩形已经绘制,如果用户绘制一个新的旧的矩形将被删除?

你不应该在OnMouseMove中使用ReleaseCapture(),否则如果鼠标在窗外,你会错过OnLButtonUp。对于你的矩形,使用常规的绘图原语,而不是在矩形完成后拖动原语。

要删除旧的矩形,然后使用特殊的笔绘制一个新的矩形,该笔没有自己的颜色,但会反转现有的图像像素。然后在旧的矩形上绘制将擦除它。参见WM_MOUSEMOVE中的示例:

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