c++ - 鼠标单击 CStatic 控件后 OnLButtonUp 未触发

标签 c++ mfc

我有一个 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 占用了所有调用吗?

此外,任何人都可以就如何修改我的代码提出建议,以便在已经绘制矩形的情况下,如果用户绘制新矩形,旧矩形将被删除吗?

最佳答案

您不应该在 OnMouseMove 中使用 ReleaseCapture(),否则如果鼠标在窗口外,您将错过 OnLButtonUp。关于您的矩形,使用常规绘图图元,不要在矩形完成后拖动图元。

关于c++ - 鼠标单击 CStatic 控件后 OnLButtonUp 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215295/

相关文章:

c++ - 我可以创建一种在C++运行时确定的类型的指针吗?

c++ - 按位运算和严格别名

c++ - 使 MFC 模态化(同步)

visual-c++ - MFC 如何创建具有滚动功能的上下文菜单

c++ - MFC:如何创建带有透明 PNG 作为背景(而不是窗口镶边)的 Skinnied Dialog?

c++ - 自定义 Vector2D 类中的浮点错误

c++为什么这个前向声明失败了?

c++ - 返回的对象如何可分配?

c++ - 导入 VC++2005 时 CString 出错?

c++ - 组合框 - OnCtlColor : How to color the whole list rect