Delphi Как получить позицию курсора на элементе управления? - PullRequest
4 голосов
/ 11 июля 2011

Я хочу знать положение курсора на TCustomControl. Как найти координаты?

Ответы [ 3 ]

13 голосов
/ 11 июля 2011

GetCursorPos может быть полезным, если вы не можете обработать событие мыши:

function GetCursorPosForControl(AControl: TWinControl): TPoint;
var 
  P: TPoint; 
begin
  Windows.GetCursorPos(P);
  Windows.ScreenToClient(AControl.Handle, P );
  result := P;
end;
6 голосов
/ 11 июля 2011

Вы можете использовать событие MouseMove:

procedure TCustomControl.MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Label1.Caption := IntToStr(x) + ' ' + IntToStr(y);       
end;
4 голосов
/ 11 июля 2011

Если вам нужно положение курсора, когда они щелкают по элементу управления, тогда используйте Mouse.CursorPos, чтобы получить положение мыши, и Control.ScreenToClient, чтобы преобразовать это в положение относительно элемента управления.

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pt: TPoint;
begin
  pt := Mouse.CursorPos;
  pt := Memo1.ScreenToClient(pt);
  Memo1.Lines.Add(Format('x=%d, y=%d', [pt.X, pt.y]));
end;

РЕДАКТИРОВАТЬ:

Как отмечали разные люди, это бессмысленно для события мыши вниз.Однако, поскольку TCustomControl.OnMouseDown защищен, он не всегда может быть легко доступен на сторонних элементах управления - учтите, что я, вероятно, не использовал бы элемент управления с таким недостатком.

Лучшим примером может быть событие OnDblClick,где нет информации о координатах:

procedure TForm1.DodgyControl1DblClick(Sender: TObject);
var
  pt: TPoint;
begin
  pt := Mouse.CursorPos;
  pt := DodgyControl1.ScreenToClient(pt);
  Memo1.Lines.Add(Format('x=%d, y=%d', [pt.X, pt.y]));
end;
...