Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

Как из Image сделать полноценную кнопку?   Найти похожие ветки 

 
BadTester   (2006-07-26 16:33) [0]

Есть проблемма. Помогите плиз!!!Нужно реализовать полноценную кнопку из Image. Как реализовать такой эффект, когда происходит нажатие по Image то копируется регион из BMP файла , это делается так -

Wizard:=Tbitmap.Create;
Wizard.LoadFromFile(ExtractFilePath(ParamStr(0)) + "\Skins\Skin1.bmp");
BitBlt(OpenImg.Canvas.Handle,0,0,21,21, Wizard.Canvas.Handle,0,0,SrcCopy);


Потом при наведение курсора на Image - onMouseMove у меня работает так:

procedure TfrmMain.OpenImgMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
OpenImg.Visible := false;
OpenImg.Visible := true;
BitBlt(OpenImg.Canvas.Handle,0,0,21,21, Wizard.Canvas.Handle,0,21,SrcCopy);

end;


При onMouseDown:

procedure TfrmMain.OpenImgMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
OpenImg.Visible := false;
OpenImg.Visible := true;
BitBlt(OpenImg.Canvas.Handle,0,0,21,21, Wizard.Canvas.Handle,0,84,SrcCopy);
end;


Как сделать так чтоб при нажатии на рисунок происходила проверка Если нажата клавиша и отпущена то происходит событие, а Если нажата и неотпущена то ничего неделать. Собственно нужно сделать так чтоб работало как в стандартных кнопках.


 
@!!ex ©   (2006-07-26 19:05) [1]

Значит так.
1) ИМХо имж для этого использовать отстойно.
Могу дать модуль в котором реализовано класс типа графическая кнопка.
Но ува он не визуальный и создавать его придеться руками, извиняюсь, но компоненты не пишу.
2) На OnMouseDown в некую булевскую переменную пишешь - true
на OnMouseUp смотришь, если булевская переменная TRUE, значит выполнить действие которое надо выполнить при нажатии кнопки.


 
BadTester   (2006-07-26 19:21) [2]

Спасиб. Давай посмотрю


 
BadTester   (2006-07-26 19:40) [3]

Чето непалучается.....


 
BadTester   (2006-07-26 19:47) [4]

У меня два Image на одну кнопку. Первый служит для появления и наведения , а второй для нажатия. Понимаешь? Как для двух сделать?


 
@!!ex ©   (2006-07-26 19:47) [5]

http://www.afera-net.narod.ru/GButton.rar

var
Button:TGButton;

Procedure ButtonPress(Handle:integer); stdcall;
begin
case Handle of
 Button.Handle:{Действие};
 end;
end;

OnCreate:
Button:=TGButton.Create, Form1.Handle, GetDC(Form1.Handle),X,Y,Width,Height,"Button.bmp",ButtonPress);

OnPaint:
Button.Update;

OnMouseDown:
LBPressed:=True;
Button.Update;

OnMouseUp:
LBPressed:=False;
Button.Update;

Картинка для кнопки - это BMP содержащий три состояния кнопки:
1) Обычное.
2) С наведеной мышой.
3) Нажатое.
В bmpшнике они расположеный друг за другом по горизонтали


 
@!!ex ©   (2006-07-26 19:48) [6]

Упс. Опечатался. вот правильное.

Button:=TGButton.Create(Form1.Handle, GetDC(Form1.Handle),X,Y,Width,Height,"Button.bmp",ButtonPress);


 
@!!ex ©   (2006-07-26 20:01) [7]

BadTester  
У меня два Image на одну кнопку. Первый служит для появления и наведения , а второй для нажатия. Понимаешь? Как для двух сделать?

Да также как и для одного.
Хотя гемор еще тот.... :))
<offtop>
Когда первый свой медиаплеер писал, тоже кнопочки через сменные имажи делал.... Захарился.... :))
</offtop>


TopImage:OnMouseDown
begin
TopImage.Visible:=false;
BottomImage.Visible:=True;
end;

BottomImage:OnMouseUp
begin
TopImage.Visible:=true;
BottomImage.Visible:=false;
Выпонение нужного действия.
end;

Будет работать. Но будет неприятный глюк, если нажать мышой на имадже, а отпустить где нить в другом месте.


 
BadTester   (2006-07-26 20:08) [8]

Да да, как от этого избавиться? Если хочешь можешь посмотреть мой плеер.
www.terabit.by.ru


 
BadTester   (2006-07-26 20:10) [9]

Procedure ButtonPress(Handle:integer); stdcall;
begin
case Handle of
Button.Handle:{Действие}; -----> Какое действие?Что писать?И как?
end;
end;


 
@!!ex ©   (2006-07-26 20:17) [10]

>>Какое действие?Что писать?И как?
Ну собственно действие которое должно выполняться по нажатию на кнопку. :)
Выкгдяит примерно так:

Procedure ButtonPress(Handle:integer); stdcall;
begin
case Handle of
Button_Close.Handle:
begin
   Form1.Close;
end;
Button_Save.Handle:
begin
Memo1.Lines.SaveToFile();
end;
end;
end;



 
BadTester   (2006-07-26 20:20) [11]

Спасиб чувак!!! Щас буду пробовать


 
@!!ex ©   (2006-07-26 20:22) [12]

>>Да да, как от этого избавиться? Если хочешь можешь посмотреть мой плеер.

Я обычно вешаю на OnMouseMove формы Update всех кнопок.
Но тут я тебе не слишком хороший советчик.

сто лет уже ничего на GDI  не писал.

А модуль который тебе взял изначально вообще для OpenGL написан.



Страницы: 1 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
1-1170324224
DelphiLexx
2007-02-01 13:03
2007.03.25
DBGridEh с возможностью округления Double-полей


1-1170495138
Medved_
2007-02-03 12:32
2007.03.25
StringGrid


15-1172650561
Tor
2007-02-28 11:16
2007.03.25
Как установить вторую Delphi 7 на одной машине


2-1172674959
Lonix
2007-02-28 18:02
2007.03.25
Вопрос по SMTP


11-1151791408
Александра
2006-07-02 02:03
2007.03.25
dll : вторая форма и выгрузка.