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

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

Как из Image сделать полноценную кнопку? [D7, Win2k, WinXP]


BadTester ©   (2006-07-26 16:33:00) 

Есть проблемма. Помогите плиз!!!Нужно реализовать полноценную кнопку из 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 20:22:00) [1]

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

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

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

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


BadTester   (2006-07-26 20:20:00) [2]

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


@!!ex   (2006-07-26 20:17:00) [3]

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

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:10:00) [4]

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


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

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


@!!ex   (2006-07-26 20:01:00) [6]

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

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


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

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

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


@!!ex   (2006-07-26 19:48:00) [7]

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

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


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

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


@!!ex   (2006-07-26 19:47:00) [9]

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шнике они расположеный друг за другом по горизонтали


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

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


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

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


@!!ex   (2006-07-26 19:05:00) [12]

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


Наверх

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