問題の説明
Delphi コンポーネントがあります。値を設定するには、クリック アンド ドラッグします。
しかし、画面の端まで来てしまうと、それ以上進むことができません。次に、コンポーネントに戻ってさらにドラッグする必要がありますが、これはあまりユーザーフレンドリーではありません。
優先ソリューション
私が望むのは、端に到達した場合にマウスカーソルを画面の周りに巻き付けて、値をスクロールし続けることができるようにすることです。3dsmax はこのタイプの GUI コントロールを広範囲に使用しており、その仕組みが気に入っています。
または、カーソルが画面外に出ても、画面の境界外にある X/Y 座標を送信し続けても問題ありません。
私がこれまでに持っているもの
Mouse.CursorPos を介して現在のマウス位置を取得/設定できることと、Screen.Width および Screen.Height を介して画面の寸法を取得できることを知っています。
以下のコードは、私が望むようにマウスカーソルをラップします。
procedure TFormXXXX.YYYYMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
LX, LY: Integer;
begin
LX := Mouse.CursorPos.X;
if LX < 1 then
LX := Screen.Width - 1
else
if LX>Screen.Width -2 then
LX := 0;
LY := Mouse.CursorPos.Y;
if LY < 1 then
LY := Screen.Height - 1
else
if LY>Screen.Height -2 then
LY := 0;
Mouse.CursorPos := Point(LX, LY);
end;
開始点から適切なオフセットを取得するためにラップを「手動で」追跡しなければならないという問題がまだありますが、それを解決する方法を見つけます。
これがこれを行うための適切なアプローチであるかどうかはわかりません。多分誰かがこれについて言うべき経験や賢明な言葉を持っています...
主な質問
これに対する試行錯誤された一般的なアプローチはありますか?Windowsはおそらくこのようなことをするためのものを提供していますか?
私が持っているいくつかの疑問
- 複数のモニターがある場合、これはどのように動作しますか?
- ユーザーが低速 (VNC?) 接続を介して接続されている場合はどうなりますか?カーソル位置は常に 0 または画面の端に到達しますか?
- 入力コントロールがマウスではなく、スケッチパッドまたはタッチスクリーンの場合はどうなりますか?
- マウスの位置を変えるのは悪い習慣ですか? 私のアプリケーションがマウス カーソルの位置をいじるのをユーザーが好まないことは想像に難くありません。