我正在尝试在我的应用程序中实现一项功能,以将光标捕捉到场景中的网格边缘。就目前而言,我确实有框架来获取当前MouseMove提供的e.Location并转换为我的世界坐标并返回屏幕 - 并且值匹配。请参阅下面的基本代码概述。
public void Scene_MouseMove(object sender, MouseEventArgs e)
{
Vector2 world = ScreenToWorld(e.Location);
---> Check here to make sure the world coordinates returned
fall inside my grid scene edges.
if (world.X < Grid.Left) world.x = Grid.Left;
Point target = WorldToScreen(world);
// set cursr desired position
Cursor.Position = (sender as PictureBox).PointToScreen( target );
}
我遇到的问题是 MouseMove 在鼠标移动之后被调用,所以当我点击网格的边缘时,我看到鼠标过冲了一帧,然后自行纠正。当我移动鼠标时,这会导致光标在边缘抖动。我想这样做,所以当我击中边缘时,光标停止在其轨道上,但我不知道如何在鼠标移动之前捕获数据!
也许我正在解决这个错误,所以任何建议将不胜感激。
仅供参考 - 这是我尝试实现的 SnapToGrid 功能的第一部分。
编辑:一个更简单的例子:
您可以在下面运行简单示例时看到我的问题。请注意光标在您移动时如何在每一帧中闪烁?
bool g_Set = false;
public void Scene_MouseMove(object sender, MouseEventArgs e)
{
// stop MouseMove from flooding the control recursively
if(g_Set) { g_Set = false; return; }
g_Set = true;
Cursor.Position = new Point(400,400);
}
C# 是否支持 API 中的任何内容以在实际移动 Cursor 之前捕获MouseMove,还是我应该只是研究实现我自己的 Cursor 类来隐藏Form.Cursor并只渲染我的(我需要研究的其他内容)也不知道该功能)。