Mfc OnMouseMove处理程序中的CRICHEDITCRL::SetRedraw()会导致无限循环
过分简化,我的CRichEditCtrlEx类中有下一个WM_MOUSEMOVE消息处理程序,它是从CRichEditCtrl派生的:Mfc OnMouseMove处理程序中的CRICHEDITCRL::SetRedraw()会导致无限循环,mfc,mousemove,redraw,cricheditctrl,Mfc,Mousemove,Redraw,Cricheditctrl,过分简化,我的CRichEditCtrlEx类中有下一个WM_MOUSEMOVE消息处理程序,它是从CRichEditCtrl派生的: void CRichEditCtrlEx::OnMouseMove(UINT nFlags, CPoint Point) { SetRedraw(FALSE); // some actions, which should not cause rich edit redrawing SetRedraw(TRUE); } 问题是SetRed
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)
{
SetRedraw(FALSE);
// some actions, which should not cause rich edit redrawing
CRect rc;
GetClientRect(&rc);
ValidateRect(&rc);
SetRedraw(TRUE);
}
SetRedraw()有什么问题
任何想法都将不胜感激
UPD:我发现WM_MOUSEMOVE消息可能不仅是由鼠标移动引起的,有时也是由窗口绘图引起的。通过存储最后一个鼠标位置并检查鼠标是否真的移动,可以避免无限循环,但对我来说,这似乎是一个解决办法。WM_MOUSEMOVE消息有点特殊,正如本文所证明的:当直接使用RedrawWindow API代替SetRedraw时会发生什么?“重画窗口”有更多可控制的选项drawing@cha,如果我使用RedrawWindow而不是SetRedraw,则无论我使用RedrawWindow的哪个扩展选项,在SetRedraw(FALSE)和SetRedraw(TRUE)调用之间调用setel()方法后,我都无法阻止RichEdit被重新绘制。
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);
}