Как переместить круг с помощью мыши в Delphi? - PullRequest
3 голосов
/ 05 марта 2010

Как переместить круг с помощью мыши в Delphi?

circle:Shape;

Ответы [ 3 ]

6 голосов
/ 05 марта 2010

Обязательно конвертируйте клиентские координаты Mouse X, Y, которые вы получаете из MouseMove в вашем Control, в клиент Родителя, используя ClientToScreen и ScreenToClient.

Следующая процедура перемещает центр элемента управления в точку (X, Y) в его клиентских координатах:

procedure MoveControl(AControl: TControl; const X, Y: Integer);
var
  lPoint: TPoint;
begin
  lPoint := AControl.Parent.ScreenToClient(AControl.ClientToScreen(Point(X, Y)));
  AControl.Left := lPoint.X - AControl.Width div 2;
  AControl.Top := lPoint.Y - AControl.Height div 2;
end;

Теперь, чтобы переместить ваш TShape при нажатии, вы должны предоставить следующий обработчик события MouseMove:

procedure TForm1.ShapeToMoveMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then // only move it when Left-click is down
    MoveControl(Sender as TControl, X, Y);
end;

И чтобы проверить это, нажмите кнопку в форме с этим кодом:

procedure TForm1.ButtonTestClick(Sender: TObject);
begin
  with TShape.Create(nil) do
  begin
    Name := Format('ShapeToMove%d',[Self.ControlCount + 1]);
    Parent := Self; // Parent will free it
    Shape := stCircle;
    Width := 65;
    Height := 65;
    OnMouseMove := ShapeToMoveMouseMove;
  end;
end;

Это минималистский пример, но он должен помочь вам начать.
Для развлечения просто подключите другие элементы управления с помощью этого обработчика событий MouseMove ...: -)

5 голосов
/ 05 марта 2010

Если вы зайдете на мою веб-страницу, вы можете найти несколько примеров (все с кодом), которые помогут вам в этом вопросе. «Образец для визуальной работы с рисунками и планами» ; Используйте два компонента для визуального управления, перемещения, изменения размера и сохранения элементов; Один для выбора, перемещения, изменения размера, ... (TSeleccOnRuntime) и другой (TSaveComps) для сохранения состояния (позиция, размер, ...). альтернативный текст http://neftali -mirror.site11.com / images / imagen_ej_restaurante.png

Выбор фигур визуально ; Пример для объяснения двух режимов для выбора визуально фигур и изображений.

Создание, перемещение и сохранение элементов управления в среде выполнения (например, в среде IDE) ; Еще один пример компонента TSeleccOnRuntime. Имитация и IDE.

альтернативный текст http://neftali -mirror.site11.com / images / image_ej_form_designer.png

И, наконец, еще один пример для Создание / уничтожение компонентов во время выполнения и перемещение с помощью мыши ; Этот образец сделан без компонентов. Весь код в образце.

альтернативный текст http://neftali -mirror.site11.com / images / imagen_ej_mover_mouse.png

Надеюсь, это полезно для вас.
С уважением

П.Д .: Извините за мой плохой английский.

0 голосов
/ 05 марта 2010

Что ж, у меня не так уж много работы, но движение чего-то, чтобы следовать за мышью, обычно работает так:

Где-нибудь есть флаг "IsFollowingMouse". Включите, когда вы должны следовать за мышью. В событии MouseMove формы сделайте что-то вроде этого:

procedure TMyForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FIsFollowingMouse then
  begin
    myCircle.left := x + fShapeOffsetX;
    myCircle.top := y + fShapeOffsetY;
  end;
end;

Смещения - это переменные, которые вы используете, которые дают разницу между расположением указателя мыши и верхним левым углом TShape.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...