コントロールがクリックされたときにマウスの座標を取得するにはどうすればよいですか?
質問
TImageのOnClickイベントで、マウスのx、y座標を抽出したいと思います。私は画像に関してはそれらを好むでしょうが、フォームやウィンドウに関しては同じくらい良いです。
解決
Mouse.CursorPosにはTPointが含まれ、TPointにはX位置とY位置が含まれます。この値はグローバル座標にあるため、画面座標をウィンドウ座標に変換するScreenToClientルーチンを使用してフォームに変換できます。
Delphiヘルプファイルによると、Windows.GetCursorPosは失敗する可能性があり、Mouse.CursorPosはこれをラップして、失敗するとEOsExceptionを発生させます。
var
pt : tPoint;
begin
pt := Mouse.CursorPos;
// now have SCREEN position
Label1.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
pt := ScreenToClient(pt);
// now have FORM position
Label2.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
end;
他のヒント
Mouse.CursorPos
プロパティは、マウスの現在の位置を示します。コンピューターの動作が遅い場合、またはプログラムのメッセージへの応答が遅い場合、 OnClick
イベントが最初に発生したときのマウスの位置とは異なる場合があります。マウスボタンがクリックされた時点でのマウスの位置を取得するには、 GetMessagePos
。 画面座標を報告します。 TImage.ScreenToClient
を使用してクライアント座標に変換します。
別の方法は、 OnMouseDown
および OnMouseUp
イベントを自分で処理することです。パラメーターには座標が含まれます。 クリックが発生するには、両方のイベントが発生する必要があることに注意してください。また、ドラッグはクリックとしてカウントされるとは思わないので、ドラッグ操作を検出することもできます。
他の人が言ったように、Mouse.CursorPosまたはGetCursorPos関数を使用できますが、OnClickの代わりにOnMouseDownまたはOnMouseUpイベントを処理することもできます。このようにして、追加の関数呼び出しを行うことなく、イベントハンドラーのパラメーターとしてX値とY値を取得します。
これはどうですか?
procedure TForm1.Button1Click(Sender: TObject);
var
MausPos: TPoint;
begin
GetCursorPos(MausPos);
label1.Caption := IntToStr(MausPos.x);
label2.Caption := IntToStr(MausPos.y);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetCursorPos(600, 600);
end;
これをどこかでオンラインで一度見つけて、私のコードスニペットDBに保存しました:)
このページは、おそらくすべての質問を解決します。 。クライアントから画面座標に移動したり戻したりする関数があるようです。
がんばって!