3

問題の説明

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 または画面の端に到達しますか?
  • 入力コントロールがマウスではなく、スケッチパッドまたはタッチスクリーンの場合はどうなりますか?
  • マウスの位置を変えるのは悪い習慣ですか? 私のアプリケーションがマウス カーソルの位置をいじるのをユーザーが好まないことは想像に難くありません。
4

1 に答える 1

4

単純な線形スケールを使用するのではなく、コントロールからの距離の増加に伴って変化を加速し、それを超えると自動的に増加し始めるカットオフを設定できます。基本的に、ドラッグしてテキストを選択するのと同じように機能させます。マウスがウィンドウの下部に到達すると、マウスがそのポイントに到達すると動きを止めても、ウィンドウがスクロールを開始します。

于 2010-11-03T19:54:04.690 に答える