OnMouseMove处理程序中的CRichEditCtrl :: SetRedraw()导致无限循环

时间:2014-02-07 00:24:28

标签: mfc mousemove redraw cricheditctrl

过度简化,我的CRichEditCtrlEx类中有下一个WM_MOUSEMOVE消息处理程序,它来自CRichEditCtrl:

void CRichEditCtrlEx::OnMouseMove(UINT nFlags, CPoint Point)
{
    SetRedraw(FALSE);
    // some actions, which should not cause rich edit redrawing
    SetRedraw(TRUE);
}

问题是SetRedraw(TRUE),以SetRedraw(FALSE)开头,以某种方式在消息队列中放置一个新的WM_MOUSEMOVE消息,因此OnMouseMove处理程序将被无限调用,即使鼠标不移动。

试图找到麻烦,我尝试了以下简单的处理程序:

void CRichEditCtrlEx::OnMouseMove(UINT nFlags, CPoint Point)
{
    RedrawWindow();
}

void CRichEditCtrlEx::OnMouseMove(UINT nFlags, CPoint Point)
{
    Invalidate();
},

但它们不会导致无限循环。

我也尝试验证客户端区域,但它没有帮助:

void CRichEditCtrlEx::OnMouseMove(UINT nFlags, CPoint Point)
{
    SetRedraw(FALSE);
    // some actions, which should not cause rich edit redrawing
    CRect rc;
    GetClientRect(&rc);
    ValidateRect(&rc);
    SetRedraw(TRUE);
}

SetRedraw()有什么问题?

任何想法都会受到赞赏。

UPD:我看到WM_MOUSEMOVE消息不仅可能由鼠标移动引起,有时也可能由窗口绘制引起。通过存储最后一个鼠标位置并检查鼠标是否真的被移动,可以避免无限循环,但对我来说似乎是一种解决方法。

0 个答案:

没有答案