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

Рисование ручки для изменения размера на TPanel в Delphi

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

При разработке графического интерфейса с помощью Delphi часто возникает необходимость нарисовать ручку для изменения размера (size grip) на панели (TPanel). Это позволяет пользователю изменить размер панели, перетаскивая эту ручку. В данной статье мы рассмотрим, как добавить такую ручку на TPanel, не используя дополнительные компоненты, которые могут мешать обработке событий мыши.

Подход, который мы будем использовать, основан на создании нового класса, унаследованного от TPanel. В этом классе мы переопределим методы Paint, MouseDown, MouseMove и MouseUp, чтобы добавить функциональность рисования ручки и изменения размера панели.

Пример кода:

type
  TSizablePanel = class(TPanel)
  private
    FDragOrigin: TPoint;
    FSizeRect: TRect;
  protected
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  end;

procedure TSizablePanel.Paint;
begin
  inherited;
  // Рисуем ручку для изменения размера на панели
  with Canvas do
  begin
    Brush.Color := clBlack;
    Pen.Color := clBlack;
    Pen.Width := 1;
    Rectangle(FSizeRect);
  end;
end;

procedure TSizablePanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  if (Button = mbLeft) and (Shift = []) and PtInRect(FSizeRect, Point(X, Y)) then begin
    FDragOrigin := Point(X, Y);
    // Нужно захватить события мыши, даже если указатель мыши покидает панель.
    // См. также: ReleaseCapture.
    SetCapture(Handle);
  end else
    inherited;
end;

procedure TSizablePanel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  if (Shift = []) and (WindowState = wsCaptured) then begin
    // Изменяем размер панели, перетаскивая указатель мыши
    Width := Width + X - FDragOrigin.X;
    Height := Height + Y - FDragOrigin.Y;
    FDragOrigin := Point(X, Y);
    Repaint;
  end;
end;

procedure TSizablePanel.MouseUp(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  if (Button = mbLeft) and (Shift = []) and (WindowState = wsCaptured) then begin
    // Освобождаем захват мыши
    ReleaseCapture;
  end;
  inherited;
end;

Чтобы использовать этот класс, достаточно создать экземпляр TSizablePanel вместо TPanel в своем интерфейсе. При наведении указателя мыши на рисованную ручку и нажатии левой кнопки мыши пользователь сможет изменить размер панели, перетаскивая указатель мыши.

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

Надеюсь, эта статья поможет вам добавить ручку для изменения размера на TPanel в ваших проектах Delphi!

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

Приведенный текст описывает процесс добавления ручки для изменения размера на панель в Delphi без использования дополнительных компонентов, переопределяя методы Paint, MouseDown, MouseMove и MouseUp в унаследованном классе TSizablePanel от TPanel.


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

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




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


:: Главная :: TPanel ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 21:58:46/0.003403902053833/0