CRichEditCtrl::SetRedraw() в обработчике OnMouseMove вызывает бесконечный цикл
Проще говоря, у меня есть следующий обработчик сообщений WM_MOUSEMOVE в моем классе CRichEditCtrlEx, который является производным от 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 может быть вызвано не только движением мыши, но иногда и рисованием окна. Можно избежать бесконечного цикла, сохранив последнюю позицию мыши и проверив, действительно ли мышь была перемещена, но для меня это выглядит как обходной путь.