过度简化,我的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消息不仅可能由鼠标移动引起,有时也可能由窗口绘制引起。通过存储最后一个鼠标位置并检查鼠标是否真的被移动,可以避免无限循环,但对我来说似乎是一种解决方法。