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

Mfc OnMouseMove处理程序中的CRICHEDITCRL::SetRedraw()会导致无限循环,mfc,mousemove,redraw,cricheditctrl,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); } 问题是SetRed

过分简化,我的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)
{
    SetRedraw(FALSE);
    // some actions, which should not cause rich edit redrawing
    CRect rc;
    GetClientRect(&rc);
    ValidateRect(&rc);
    SetRedraw(TRUE);
}
SetRedraw()有什么问题

任何想法都将不胜感激


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

WM_MOUSEMOVE消息有点特殊,正如本文所证明的:当直接使用RedrawWindow API代替SetRedraw时会发生什么?“重画窗口”有更多可控制的选项drawing@cha,如果我使用RedrawWindow而不是SetRedraw,则无论我使用RedrawWindow的哪个扩展选项,在SetRedraw(FALSE)和SetRedraw(TRUE)调用之间调用setel()方法后,我都无法阻止RichEdit被重新绘制。
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);
}