Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Кнопка-компонент из 3 картинок (image'ей)? [D7, WinXP]


grol ©   (2005-06-25 13:52:00) 

Мастера у меня назрел еще такой вопрос! Можно ли из 3-х Image(картинок) сделать компонент-кнопку, т.е у меня есть три картинки: кнопка обычная, нажатая и активная (на ней курсор мышки)? Я конечно могу каждый раз на форму кидать по три Image, вставляя в каждый Image картинку, но это только на одну кнопку 3 image'a, а если я хочу 10 кнопок, то это будет уже 30 image'ей!!! Я представляю, что у кнопки должны быть такие свойства как у Image'a, и в свойствах этого компонета дожны быть ссылки на 3 картинки, отвечающие нужному состоянию. Сразу скажу, что BitBtn не подойдет, так как форма кнопки прямоугольником и не повторяет форму рисунка в картинки. Компонент Image он тоже прямоугольный, но если всавить в него картинку и назначить свойство Transparent, Image станет при этом позрачный и повторит форму рисунка в картинке, т.е. рисунка кнопки. Ответьте мне пожалуйста на этот вопрос! Заранее всем спасибо!


MacroDenS   (2005-06-27 14:18:00) [1]

А нафига тебе 3 имаджа? Картинки в ресурс или с собой... 1 имадж обрабатываем указанные события, грузим из понравившихся мест. Это для варианта если просто имагом пользоваться.
Хотя (сугубо мое ИМХО), если и компонент посать, то там 3 имага вроде тоже не нужны, принцып тот же...


NightStranger   (2005-06-27 01:28:00) [2]

Зачем изобретать велосипед? www.nightstranger9.narod.ru/delphi/bevlab.zip


Eraser   (2005-06-26 17:52:00) [3]

Nik_vr ©   (26.06.05 13:27) [10]
Меньше модулей - меньше вес программы :)


Однако скорость разработки в разы больше... так что неизвестно ЧТО лучше...


Nik_vr   (2005-06-26 13:27:00) [4]

Меньше модулей - меньше вес программы :)


Antonn   (2005-06-26 09:07:00) [5]


> по-моему лучше будет прикрутить ImageList чем каждую
> картинку расписывать..

я так себе и делал :)


злобная танька   (2005-06-26 08:29:00) [6]


> Nik_vr ©   (25.06.05 17:09) [5]

по-моему лучше будет прикрутить ImageList чем каждую картинку расписывать..


ferr   (2005-06-25 18:10:00) [7]

constructor Create;
может не так...


Eraser   (2005-06-25 17:12:00) [8]

grol ©   (25.06.05 13:52)

Почти в любом наборе компонентов третьих производителей есть такой компонент. Советую пакет ком-в JEDI VCL - там всё (почти) и сразу.


Nik_vr   (2005-06-25 17:09:00) [9]

Вот пример, написанный на основе Graphic32...

unit GRButton32;

interface

uses
 SysUtils, Classes, Controls, GR32_Image, GR32, Dialogs;

type
TButtonState=(bsInactive, bsPushed, bsUsed);

type
 TButton32 = class(TImage32)
 private
   FInactiveButton: TBitmap32;
   FPushedButton: TBitmap32;
   FUsedButton: TBitmap32;
   FState: TButtonState;
   FChecked: boolean;
   procedure SetPushedButton(const Value: TBitmap32);
   procedure SetInactiveButton(const Value: TBitmap32);
   procedure SetUsedButton(const Value: TBitmap32);
   procedure SetChecked(const Value: boolean);
 protected
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); overload; override;
   procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); overload; override;
 public
   { Public declarations }
   constructor Create;    
   // Set images
   property InactiveButton: TBitmap32 read FInactiveButton write SetInactiveButton;
   property PushedButton: TBitmap32 read FPushedButton write SetPushedButton;
   property UsedButton: TBitmap32 read FUsedButton write SetUsedButton;
   // Load images
   procedure LoadInactiveButton(FileName: string);
   procedure LoadPushedButton(FileName: string);
   procedure LoadUsedButton(FileName: string);
   //
   procedure DrawButton;
   property Checked: boolean read FChecked write SetChecked;    
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Graphics32', [TButton32]);
end;

{ TButton33 }

procedure TButton32.LoadPushedButton(FileName: string);
var
tempImage: TBitmap32;
begin
tempImage:=TBitmap32.Create;
tempImage.LoadFromFile(FileName);
FPushedButton:=tempImage;
end;

procedure TButton32.LoadInactiveButton(FileName: string);
var
tempImage: TBitmap32;
begin
tempImage:=TBitmap32.Create;
tempImage.LoadFromFile(FileName);
FInactiveButton:=tempImage;
end;

procedure TButton32.LoadUsedButton(FileName: string);
var
tempImage: TBitmap32;
begin
tempImage:=TBitmap32.Create;
tempImage.LoadFromFile(FileName);
FUsedButton:=tempImage;
end;

procedure TButton32.SetPushedButton(const Value: TBitmap32);
begin
 FPushedButton := Value;
end;

procedure TButton32.SetInactiveButton(const Value: TBitmap32);
begin
 FInactiveButton := Value;
end;

procedure TButton32.SetUsedButton(const Value: TBitmap32);
begin
 FUsedButton := Value;
end;

procedure TButton32.DrawButton;
begin
case FState of
 bsInactive: Bitmap:=FInactiveButton;
 bsPushed: Bitmap:=FPushedButton;
 bsUsed: Bitmap:=FUsedButton;
end;

Height:=Bitmap.Height;
Width:=Bitmap.Width;      
end;

constructor TButton32.Create;
begin
 FState:=bsInactive;
end;

procedure TButton32.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
 Y: Integer);
begin
 inherited;
 if Button<>mbLeft then exit;
 FState:=bsPushed;
 DrawButton;
end;

procedure TButton32.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
 Y: Integer);
begin
 inherited;
 if Button<>mbLeft then exit;
 if FChecked
  then FState:=bsUsed
  else FState:=bsInactive;

//  FState:=bsInactive;
 DrawButton;
end;

procedure TButton32.SetChecked(const Value: boolean);
begin
 FChecked := Value;
 if FChecked
  then FState:=bsUsed
  else FState:=bsInactive;

 DrawButton;
end;

end.


ferr   (2005-06-25 16:14:00) [10]

А перерисовывать кто будет? в OnPaint.


злобная танька   (2005-06-25 14:56:00) [11]

ну напиши наследника от TGraphicControl..
в свойствах укажи например
 array[1..3] of TBitMap;

определи методы обработки сообщений CM_MOUSELEAVE и CM_MOUSEENTER и прочих что от мыши приходят. в этих методах будет код типа

procedure TImButton.Mousedown;
begin
Canvas.Draw(0,0,imgs[3]);
OnMouseDown;
end;

OnMouseDown - переменная типа TMouseEvent (метод)


grol   (2005-06-25 14:17:00) [12]

Очень хороший ответ! Спасибо я все понял!


злобная танька   (2005-06-25 14:13:00) [13]

можно!


Наверх

Титульная страница Поиск, карта сайта Написать письмо