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