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