Створення власної кнопки в Delphi, HTML, XML, DHTML, Інтернет-технології, статті

Доброго дня шановний програміст! Раніше, при створенні програмного забезпечення на мові Delphi, Ви використовували лише стандартний інтерфейс MS Windows. Але, як видно, Вам цього недостатньо і Ви хочете додати оригінальності та унікальності в оформлення свого застосування. Про те, як це зробити, я Вам і розповім в цій статті. Стаття буде присвячена створенню власних елементів керування, а власне кнопок, використовуючи мову програмування Delphi.

Приступимо до справи. Припустимо проект, для якого ми створюємо кнопку, вже відкритий. Для початку створимо новий модуль (File New Unit). Давайте відразу збережемо модуль (натиснувши Ctrl + Shift + S) під ім'ям MyButtonUnit. У модулі ми бачимо два розділи: interface і implementation. У першому розділі ми будемо описувати Plug-in, типи даних, процедури, константи і змінні, а в другому буде знаходитися сам код.

Після interface опишемо модулі, які нам знадобляться. Це виглядає так:

interface
   uses Classes, Controls, Windows, Graphics, Messages;

Після цього необхідно описати створюваний нами новий клас (TMyButton), в основу якого буде покладено клас TCustomControl.
 


type TMyButton = class(TCustomControl)
   private
   protected
   public
end;


Ви бачите три розділи нашого класу: private, protected і public. У першому описуються змінні і процедури, які будуть доступні для використання тільки в межах даного класу. У розділі protected описуються методи, реалізовані в батьківському класі. І нарешті, третій розділ містить опис властивостей і процедур, які будуть доступні за межами даного класу.

Почнемо з розділу public.
Опишемо конструктор: constructor Create (AOwner: TComponent);
Перейдемо до розділу implementation і напишемо код, який буде виконуватися при створенні кнопки.


constructor TMyButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent := AOwner as TWinControl;
 Width := 100;
 Height := 25;
end;

 


Я привів обов'язкову частину коду. Ви ж можете доповнити його при необхідності.

Зараз саме час подумати про те, як буде працювати кнопка. Наша кнопка повинна змінювати зображення при наведенні на неї. Вона обов'язково повинна містити напис. Це мінімум! Раз кнопка буде змінювати зовнішній вигляд при наведенні на неї, то в розділі private опишемо змінну FSelected: Boolean; для зберігання стану кнопки. Промальовкою кнопки займемося пізніше. У тому ж розділі опишемо змінну FCaption : String;, яка зберігає напис на кнопці. Для того, щоб напис можна було змінювати опишемо property Caption: String read FCaption write SetCaption; в розділі public. Як Ви помітили, процедуру SetCaption ми ще не створили. Опишемо її в розділі private:

procedure SetCaption(Val: String);
 

і звичайно ж створимо сам код:

procedure TMyButton.SetCaption(Val: string);
begin
 FCaption := Val;
 paint;
end;



Процедура paint це і є вивід кнопки, яку ми зараз і займемося. Її ми опишемо в розділі protected – procedure Paint; override;.
Відразу ж напишемо код:

procedure TMyButton.Paint;
begin
 If not FSelected
 then
  begin
   Canvas.Pen.Color := $FFFFFF;
   Canvas.Brush.Color := $FFFFFF;
  end
 else
  begin
   Canvas.Pen.Color := $EEEEEE;
   Canvas.Brush.Color := $EEEEEE;
  end;


 Canvas.Rectangle(0,0,Width,Height);
Canvas.TextOut ((Width – Canvas.TextWidth (FCaption)) div 2, (Height – Canvas.TextHeight (FCaption)) div 2, FCaption);
end;



Зверніть увагу на умову. Ми передбачаємо різні варіанти оформлення при виділеною і невиділеної кнопці. Як працювати з графікою Ви, я думаю, знаєте, тому зможете дуже легко налаштувати зовнішній вигляд по-своєму.

А тепер найцікавіше: як зробити так, щоб кнопка змінювала зовнішній вигляд при наведенні?

Опишемо дві процедури в розділі private:

procedure MEnter(var Mes: TMessage); message CM_MOUSEENTER;
procedure MLeave(var Mes: TMessage); message CM_MOUSELEAVE;

Процедури реагують на повідомлення введення і виведення миші в область кнопки. Перша – на повідомлення введення, а друга – на повідомлення виводу. А ось власне і код, який вони викликають.


procedure TMyButton.MEnter(var Mes: TMessage);
begin
 FSelected := True;
 Paint;
end;


procedure TMyButton.MLeave(var Mes: TMessage);
begin
 FSelected := False;
 Paint;
end;


Як бачите, ми просто вказуємо, виділена або не виділена кнопка і перемальовує її.


Чудово, ми виконали завдання, але як впровадити кнопку у додаток? Дуже просто! Вам необхідно описати створений нами модуль в потрібному вам місці, а щоб створити кнопку опишіть її як змінну (var B: TMyButton;), створіть (B: = TMyButton.Create (self);) і відкоригують поля (B. Caption: = Button;).
В цілому:
 

procedure TForm3.FormCreate(Sender: TObject);
var
 B : TMyButton;
begin
 B := TMyButton.Create(self);
 B.Caption := Button;
end;

Тепер Ви вмієте створювати свої елементи управління і можете попрацювати над дизайном своєї програми. Удачи!
 

Вихідний код модуля:


unit MyButtonUnit;


interface
  uses Classes, Controls, Windows, Graphics, Messages;


type TMyButton = class(TCustomControl)
  private
   FSelected: Boolean;
   FCaption: String;
   procedure SetCaption(Val: String);
   procedure MEnter(var Mes: TMessage); message CM_MOUSEENTER;
   procedure MLeave(var Mes: TMessage); message CM_MOUSELEAVE;
  protected
   procedure Paint; override;
  public
   constructor Create(AOwner: TComponent);
   property Caption: String read FCaption write SetCaption;
 end;


implementation


constructor TMyButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent := AOwner as TWinControl;
 Width := 100;
 Height := 25;
end;


procedure TMyButton.SetCaption(Val: string);
begin
 FCaption := Val;
 paint;
end;


procedure TMyButton.Paint;
begin
 If not FSelected
 then
  begin
   Canvas.Pen.Color := $FFFFFF;
   Canvas.Brush.Color := $FFFFFF;
  end
 else
  begin
   Canvas.Pen.Color := $EEEEEE;
   Canvas.Brush.Color := $EEEEEE;
  end;


 Canvas.Rectangle(0,0,Width,Height);
 Canvas.Font.Color := 0;
Canvas.TextOut ((Width – Canvas.TextWidth (FCaption)) div 2, (Height – Canvas.TextHeight (FCaption)) div 2, FCaption);
end;


procedure TMyButton.MEnter(var Mes: TMessage);
begin
 FSelected := True;
 Paint;
end;


procedure TMyButton.MLeave(var Mes: TMessage);
begin
 FSelected := False;
 Paint;
end;


end.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*