シーン内のグリッドの端にカーソルをスナップする機能をアプリケーションに実装しようとしています。現状では、現在の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 機能の最初の部分です。
EDIT:より簡単な例:
以下の簡単な例を実行すると、私の問題を確認できます。カーソルを動かすと、フレームごとにカーソルがちらつくことに注意してください。
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# は、実際に Cursor を移動する前にMouseMoveをキャプチャするために API で何かをサポートしていますか、それとも Form.Cursorを非表示にしてレンダリングするだけの独自の Cursor クラスを実装することを検討する必要がありますか?その機能についても手がかりがありません)。