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

0 ответов

Другие вопросы по тегам