Главная страница
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
15-1172502918
zona
2007-02-26 18:15
2007.03.25
Помогите сделать своеобразный браузер


2-1172841092
VadimK
2007-03-02 16:11
2007.03.25
Не пойму почему не освобождается память


2-1172873858
arturich
2007-03-03 01:17
2007.03.25
отправить метод post в форму


15-1172499171
Petr V. Abramov
2007-02-26 17:12
2007.03.25
С почином!


2-1173027229
Chaval'
2007-03-04 19:53
2007.03.25
Тип db