Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с фокусным прямоугольником в Delphi: зависимость от обеих координат мыши с сохранением пропорций

Delphi , Компоненты и Классы , TImage и TImageList

Вопрос пользователя заключается в том, чтобы научиться рисовать фокусный прямоугольник на изображении в Delphi с сохранением пропорций изображения. Проблема состоит в том, что текущий код зависит только от координаты Y мыши, и пользователю необходимо сделать так, чтобы прямоугольник зависел от обеих координат, сохраняя при этом соотношение сторон.

Для начала рассмотрим, что такое фокусный прямоугольник в контексте пользовательского интерфейса. Фокусный прямоугольник — это визуальный элемент, который используется для обозначения выделенной области на изображении или в графическом интерфейсе. Он часто используется для указания выбранной области, например, при обрезке изображения или выборе области для печати.

Исходный код

Пользователь предоставил исходный код, в котором прямоугольник рисуется четырьмя различными вызовами функции DrawFocusRect, что неэффективно и приводит к путанице в логике. Кроме того, прямоугольник не сохраняет соотношение сторон изображения.

procedure TForm1.AuswahlRechteck;
begin
  Image1.Canvas.DrawFocusRect(Rect(X0,Y0,MX,MY));
  // ... другие вызовы DrawFocusRect ...
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if InMove then
  begin
    // ... код для обновления прямоугольника ...
    if (((MX < X0) AND (MY > Y0)) OR ((MX > X0) AND (MY < Y0))) then MX:=Round(X0-((MY-Y0)*Image1.Width/Image1.Height))
    else MX:=Round(X0+((MY-Y0)*Image1.Width/Image1.Height));
    AuswahlRechteck;
  end;
end;

Подход к решению

Чтобы решить проблему, необходимо изменить логику определения размеров прямоугольника. Вместо того, чтобы использовать только координату Y для определения ширины прямоугольника, нужно использовать соотношение сторон изображения для корректного масштабирования.

Реализация

Сначала определим переменные для хранения состояния выбора:

private
  FSelecting: Boolean;
  FSelRect: TRect;
  FSelX, FSelY: Integer;
end;

Теперь переопределим обработчики событий мыши:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FSelX := X;
  FSelY := Y;
  FSelecting := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Scale: Single;
  W, H: Integer;
begin
  if FSelecting then
  begin
    Image1.Canvas.DrawFocusRect(FSelRect); // Стираем предыдущий прямоугольник
    Scale := Image1.Width / Image1.Height; // Получаем соотношение сторон изображения
    W := X - FSelX;
    H := Y - FSelY;
    if (W <> 0) and (H <> 0) then
      if Abs(W) / Abs(H) > Scale then
        H := Round(Abs(W) / Scale) * Sign(H)
      else
        W := Round(Abs(H) * Scale) * Sign(W);
    FSelRect := Bounds(
      Min(FSelX, FSelX + W), Min(FSelY, FSelY + H), Abs(W), Abs(H)); // Определяем размеры прямоугольника
    Image1.Canvas.DrawFocusRect(FSelRect); // Рисуем новый прямоугольник
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FSelecting := False;
end;

Комментарии пользователя и дополнения

После внедрения предложенных изменений пользователь отметил, что небольшая корректировка позволила получить желаемый результат. Он заменил условие > Scale на < Scale и исправил назначение переменной FSelRect, чтобы устранить небольшое несоответствие.

Заключение

В результате применения предложенного подхода, фокусный прямоугольник теперь корректно отображает выделенную область с сохранением пропорций изображения, что и требовалось изначально. Пользовательский интерфейс стал более удобным и интуитивно понятным для пользователя.

Создано по материалам из источника по ссылке.

Пользователь хочет научиться рисовать фокусный прямоугольник в программе Delphi на изображении так, чтобы он зависел от обеих координат мыши и сохранял пропорции изображения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TImage и TImageList ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 11:21:02/0.0035910606384277/0