我已经创建了一个自定义控件,当鼠标离开时鼠标进入和退出时应该淡入 .

为了获得这个功能,我尝试添加一个计时器,它从 MouseEnter 开始监视鼠标位置 . 正如在this帖子中指出的那样, MouseLeave 事件不能足够可靠地触发,特别是我的表单布局方式 .

在我的计时器中,当前光标位置应该使用以下代码相对于客户端进行转换:

Point mPos = PointToClient(Cursor.Position);

当我在该行上添加断点时,调试器就会中断 . 如果我尝试单步执行代码,一切似乎都停留在循环中,代码不断返回到该点 .

永远不会达到该行之后的任何断点,但其余的非计时器代码似乎仍能完美执行 .

如果我用任何其他代码替换问题行,一切都正常执行,错误特别是在客户端转换的屏幕上 .

定时器代码如下所示:

private void FadeTimer_Tick(object sender, EventArgs e)
{
    Point mPos = PointToClient(Cursor.Position);//Execution never passes this line. No exceptions are thrown
    if (ClientRectangle.Contains(mPos))//Execution never reaches this point
        fade = fade + 20 <= 255 ? fade + 20 : 255;
    else
        fade = fade - 20 >= 100 ? fade - 20 : 100;          
    this.Invalidate();
    this.Refresh();
}

我尝试使用 RectangleToScreen 将客户端矩形转换为屏幕坐标,并发生相同的错误 .

请您告诉我为什么会发生这种情况以及我可以采取哪些措施来解决这个问题?