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

Пример компонента HotSpot

Delphi , Компоненты и Классы , Создание компонент

Пример компонента HotSpot

Автор: Robert Wittig

Вот пример HotSpot-компонента, основанного на TPanel (небольшая переделка). Управляя событиями MouseDown и MouseUp можно получить эффект резинового контура.


unit Newpanel;

interface
uses WinTypes, Classes, Controls, StdCtrls, ExtCtrls;

type

  tHotSpotClickEvent = procedure(Sender: tObject;
    Button: tMouseButton;
    Shift: tShiftState) of object;

  TNewPanel = class(tPanel)
  private
    fHotSpotClick: tHotSpotClickEvent;
    fHotSpot: tRect;
    fInHotSpot: Boolean;

    function GetHotSpotTop: Word;
    function GetHotSpotLeft: Word;
    function GetHotSpotWidth: Word;
    function GetHotSpotHeight: Word;

    procedure SetHotSpotTop(Value: Word);
    procedure SetHotSpotLeft(Value: Word);
    procedure SetHotSpotWidth(Value: Word);
    procedure SetHotSpotHeight(Value: Word);
  protected
    procedure Paint; override;
    procedure MouseDown(Button: tMouseButton; Shift: tShiftState; X, Y: Integer);
      override;
    procedure MouseUp(Button: tMouseButton; Shift: tShiftState; X, Y: Integer);
      override;
  public
    procedure Click; override;

    property HotSpot: tRect read fHotSpot write fHotSpot;
  published
    property hsTop: Word read GetHotSpotTop write SetHotSpotTop;
    property hsLeft: Word read GetHotSpotLeft write SetHotSpotLeft;
    property hsWidth: Word read GetHotSpotWidth write SetHotSpotWidth;
    property hsHeight: Word read GetHotSpotHeight write SetHotSpotHeight;

    property OnHotSpot: tHotSpotClickEvent read fHotSpotClick write
      fHotSpotClick;
  end;

procedure Register;

implementation
uses WinProcs, Graphics;

procedure Register;
begin

  RegisterComponents('Custom', [TNewPanel]);
end;

procedure TNewPanel.MouseDown(Button: tMouseButton;

  Shift: tShiftState;
  X, Y: Integer);
begin

  if PtInRect(fHotSpot, Point(X, Y)) and
    Assigned(fHotSpotClick) then
    fInHotSpot := True;
  inherited MouseDown(Button, Shift, X, Y);
end;

procedure TNewPanel.MouseUp(Button: tMouseButton;

  Shift: tShiftState;
  X, Y: Integer);
begin

  inherited MouseUp(Button, Shift, X, Y);

  if fInHotSpot then
  begin
    if Assigned(fHotSpotClick) then
      fHotSpotClick(Self, Button, Shift);
    fInHotSpot := False;
  end;
end;

procedure TNewPanel.Click;
begin

  if not fInHotSpot then
    inherited Click;
end;

procedure TNewPanel.Paint;
var

  OldStyle: tPenStyle;
begin

  inherited Paint;

  if csDesigning in ComponentState then
  begin
    OldStyle := Canvas.Pen.Style;
    Canvas.Pen.Style := psDash;
    Canvas.Rectangle(HotSpot.Left, HotSpot.Top, HotSpot.Right, HotSpot.Bottom);
    Canvas.Pen.Style := OldStyle;
  end;
end;

procedure TNewPanel.SetHotSpotTop(Value: Word);
begin

  fHotSpot.Bottom := fHotSpot.Bottom + Value - fHotSpot.Top;
  fHotSpot.Top := Value;
  Paint;
end;

procedure TNewPanel.SetHotSpotLeft(Value: Word);
begin

  fHotSpot.Right := fHotSpot.Right + Value - fHotSpot.Left;
  fHotSpot.Left := Value;
  Paint;
end;

procedure TNewPanel.SetHotSpotWidth(Value: Word);
begin

  fHotSpot.Right := fHotSpot.Left + Value;
  Paint;
end;

procedure TNewPanel.SetHotSpotHeight(Value: Word);
begin

  fHotSpot.Bottom := fHotSpot.Top + Value;
  Paint;
end;

function TNewPanel.GetHotSpotTop: Word;
begin

  Result := fHotSpot.Top
end;

function TNewPanel.GetHotSpotLeft: Word;
begin

  Result := fHotSpot.Left;
end;

function TNewPanel.GetHotSpotWidth: Word;
begin

  Result := fHotSpot.Right - fHotSpot.Left;
end;

function TNewPanel.GetHotSpotHeight: Word;
begin

  Result := fHotSpot.Bottom - fHotSpot.Top;
end;

end.

Компонент Delphi, называемый TNewPanel, является производным от TPanel. Он предназначен для создания области с горячей точкой (hot spot) внутри панели, которая может быть кликнута и вызвать событие при клике.

Компонент имеет несколько свойств:

  • HotSpot: Свойство позволяет установить прямоугольник области горячей точки.
  • hsTop, hsLeft, hsWidth и hsHeight: Эти свойства позволяют устанавливать/получать верхнюю, левую, ширину и высоту области горячей точки соответственно.
  • OnHotSpot: Свойство - обработчик события, который будет вызван при клике по области горячей точки.

Компонент имеет три процедуры:

  • MouseDown: Процедура переопределена из базового класса. Она проверяет, находится ли мышка в области горячей точки при нажатии кнопки мыши и устанавливает флаг fInHotSpot в значение true.
  • MouseUp: Процедура также переопределена из базового класса. Она проверяет, произошло ли событие отпускания кнопки мыши, когда флаг fInHotSpot был установлен в true, и если так, то вызывает обработчик события OnHotSpot.
  • Paint: Процедура используется для рисования dashed прямоугольника вокруг области горячей точки при отладке компонента.

Компонент также имеет несколько приватных переменных:

  • fHotSpotClick: Обработчик события клика по области горячей точки.
  • fInHotSpot: Флаг, указывающий, находится ли мышка в области горячей точки.
  • fHotSpot: Прямоугольник, представляющий область горячей точки.
  • hsTop, hsLeft, hsWidth и hsHeight: Privatные переменные для хранения значений соответствующих публичных свойств.

В имплементации компонента также есть несколько процедур установки/получения свойств области горячей точки (SetHotSpotTop, SetHotSpotLeft, SetHotSpotWidth и т.д.), которые обновляют приватные переменные и вызывают процедуру Paint для перерисовки компонента.

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

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


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

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




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


:: Главная :: Создание компонент ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:17:35/0.0056090354919434/1