在项目中,时常会遇到这样的场景:
某一个控件,比如RichTextBox (命名为:RtxtViewInfo)需要实时刷新计算结果。这意味着它会不停地重新绘制。通常情况下,这也没什么,但是当我们不使用鼠标时,鼠标停在了RtxtViewInfo控件上时,鼠标也会不停地刷新,这样可以看到鼠标一直在闪烁,甚至影像了系统的速度。
问题描述:
鼠标停留在控件上,控件刷新时连同鼠标一起刷新
达到目的:鼠标在控件上时,鼠标不刷新
解决思路:当鼠标处于控件上时,鼠标被控件捕获;当鼠标离开控件时,鼠标未被控件捕获
解决方案:
步骤1:添加 控件的Enter事件(进入控件):鼠标被捕获
步骤2:添加控件的Move事件(移动事件):
判断控件的鼠标位置(MousePosition)是否在控件的工作区域(ClientRectangle)中
如果是:则鼠标依旧被控件捕获 如果为否:则鼠标未被控件捕获
前提条件:鼠标的位置是以【屏幕坐标】表示的,所以 控件的工作区域(ClientRectangle)需要转换到屏幕上去
示例代码如下:
private void RtxtViewInfo_MouseEnter(object sender, EventArgs e)
{
RtxtViewInfo.Capture = true;
}
private void RtxtViewInfo_MouseMove(object sender, MouseEventArgs e)
{
if (RtxtViewInfo.Capture)
{
Rectangle rec = RtxtViewInfo.RectangleToScreen(RtxtViewInfo.ClientRectangle);
if (!rec.Contains(Control.MousePosition))
{
RtxtViewInfo.Capture = false;
}
}
}