Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как по наведению мышки включать анимацию в Animatе


Автор: Vorona 1.1.2005, 17:51
помогите решить дурацкую проблему..

В программе используются TAnimate и надо, чтобы в них начиналась анимация по OnMouseMove, но такого свойства у Animate нет. Пробовала поместить Label на Animate, чтоб появилось onmousemove. Так вот лажа: и Label-ы, и Image-и помещаются под Animate и никакие Control-Bring to front не помагают.. В общем не знаю, что и делать...

Автор: RA 1.1.2005, 18:38
Много способов есть, предложу самый быстрый с использованием таймера.


Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
 P: TPoint;
 HWND: THandle;
 WndClass : array [0..255] of Char;
begin
GetCursorPos(P);
HWND := WindowFromPoint(P);
GetClassName(HWND, WndClass, SizeOf(WndClass));
if WndClass='TAnimate' then Твоя процедура Анимирования;
end;


Автор: Fedor 1.1.2005, 19:04
Я вот быренька сделал компонент на основе TAnimate, у которого есть события OnMouseEnter и OnMouseLeave. Наворочено, конечно, но все же работает...

Автор: <Spawn> 1.1.2005, 19:14
Можно написать наследника, переопределив у него события CM_MOUSEENTER и CM_MOUSELEAVE:

Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls;

type
 TAnimateEx = class(TAnimate)
 private
   FOnMouseEnter, FOnMouseLeave: TNotifyEvent;
   procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
   procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
 public
   property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   FAnimate: TAnimateEx;
 public
   procedure OnAnimateMouseEnter(Sender: TObject);
   procedure OnAnimateMouseLeave(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TAnimateEx }

procedure TAnimateEx.CMMouseEnter(var Msg: TMessage);
begin
 if Assigned(FOnMouseEnter) then
   FOnMouseEnter(Self);
 inherited;
end;

procedure TAnimateEx.CMMouseLeave(var Msg: TMessage);
begin
 if Assigned(FOnMouseLeave) then
   FOnMouseLeave(Self);
 inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FAnimate := TAnimateEx.Create(Self);
 with FAnimate do
 begin
   Parent := Self;
   FileName := 'E:\TEMP\AVI\clock.avi';
   Left := 10;
   Top := 10;
   OnMouseEnter := OnAnimateMouseEnter;
   OnMouseLeave := OnAnimateMouseLeave;
 end;
end;

procedure TForm1.OnAnimateMouseEnter(Sender: TObject);
begin
 FAnimate.Active := True;
end;

procedure TForm1.OnAnimateMouseLeave(Sender: TObject);
begin
 FAnimate.Active := False;
end;

end.

Добавлено @ 19:16
Ой, кажись опоздалsmile Пока писал код, уже Fedor запостил.

Автор: Vorona 2.1.2005, 14:08
СПАСИБО, ПОПРОБУЮ РАЗОБРАТЬСЯ smile

Автор: dm9 2.1.2005, 16:23
Давно хотел спросить такую вещь (вроде бы, в тему smile ).

А без создания нового компонента (класса) на основе старого можно ли как-то отловить события, которых нет в компоненте по умолчанию?

Автор: <Spawn> 3.1.2005, 09:44
Сам не проверял, но думаю можно изменить WindowProc при помощи GetWindowLong, SetWindowLong, но, ИМХО, в данном случае это изврат.

Автор: Akella 3.1.2005, 10:05
А если поместить TAnimate в панель, и обрабатывать события мыши самой панели?

Автор: Vorona 3.1.2005, 18:23
dsergey

Точно!!! Огромное спасибо, это самый простой способ!!!!! smile smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)