0

単純化しすぎて、CRichEditCtrl から派生した CRichEditCtrlEx クラスに次の WM_MOUSEMOVE メッセージ ハンドラーがあります。

void CRichEditCtrlEx::OnMouseMove(UINT nFlags, CPoint Point)
{
    SetRedraw(FALSE);
    // some actions, which should not cause rich edit redrawing
    SetRedraw(TRUE);
}

問題は、SetRedraw(FALSE) の前にある SetRedraw(TRUE) が何らかの方法で新しい 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 メッセージは、マウスの動きだけでなく、ウィンドウの描画によっても発生することがあります。最後のマウス位置を保存し、マウスが本当に動かされたかどうかを確認することで、無限ループを回避できますが、回避策のように思えます。

4

0 に答える 0