![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать обработчик события OnMouseClick у компонента Animate?
Dido © (2003-11-06 22:32:00)
Заранее благодарен!
Dido (2003-11-07 15:48:00) [1]
Единственное что, пишет предупреждение: [Warning]method "WndProc" hides virtual method of base type "TCustomForm"
Что это значит, и может нужно что-то исправить...
Dido (2003-11-07 15:36:00) [2]
А все уже понял, спасибо всем!
Dido (2003-11-07 15:11:00) [3]
Всеравно не вышло...
Вот код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
Animate1: TAnimate;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MyWndProc(var Msg: TMessage);
private
fOldProc: TWndMethod;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
fOldProc := Animate1.WindowProc;
Animate1.WindowProc := MyWndProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Animate1.WindowProc := fOldProc;
end;
procedure TForm1.MyWndProc(var Msg: TMessage);
var pt: TPoint;
begin
if Msg.Msg=WM_LBUTTONDOWN then
begin
GetCursorPos(pt);
MapWindowPoints(0, Animate1.Handle, pt, 1);
ShowMessage("!");
end;
fOldProc(Msg);
end;
end.
Реагирует на нажатие LMB даже вне компонента Animate.
wicked (2003-11-07 13:45:00) [4]
читай внимательно - цитирую:
> { инициализация }
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> fOldProc := Animate1.WindowProc;
> Animate1.WindowProc := MyWndProc;
> end;
то есть MyWndProc вызывается при приходе любого сообщенияна компонент...
DillerXX (2003-11-07 13:39:00) [5]
Я не понял, кто даёт сообщение и вызывает MyWndProc(var Msg: TMessage) ?
wicked (2003-11-07 13:21:00) [6]
ой... дурная сишная привычка...
вместо
> MapWindowPoints( NULL, Animate1.Handle, @pt, 1);
надо читать
> MapWindowPoints( nil, Animate1.Handle, @pt, 1);
или
> MapWindowPoints( 0, Animate1.Handle, @pt, 1);
wicked (2003-11-07 13:17:00) [7]
примерно так... за качество не ручаюсь - на паскале давно не писал... ;)
TForm1 = class(TForm)
...
fOldProc: TWndMethod;
...
end;
{ инициализация }
procedure TForm1.FormCreate(Sender: TObject);
begin
fOldProc := Animate1.WindowProc;
Animate1.WindowProc := MyWndProc;
end;
{ clean-up (русского термина не подобрал :)) }
procedure TForm1.FormDestroy(Sender: TObject);
begin
Animate1.WindowProc := fOldProc;
end;
{ собственно обработка }
procedure TForm1.MyWndProc(var Msg: TMessage);
var pt: TPoint;
begin
case Msg.Msg of
WM_LBUTTONDOWN: begin
{...пользователь надавил левую кнопку - обрабатываем...}
// курсор мыши в экранных координатах
GetCursorPos(pt);
// переводим в координаты компонента Animate1
MapWindowPoints(NULL, Animate1.Handle, @pt, 1);
end;
WM_LBUTTONUP: begin
{...пользователь отпустил левую кнопку - обрабатываем...}
// курсор мыши в экранных координатах
GetCursorPos(pt);
// переводим в координаты компонента Animate1
MapWindowPoints(NULL, Animate1.Handle, @pt, 1);
end;
else begin
{ другие сообщения }
end;
end;
// отдаем сообщения компоненту
fOldProc(Msg);
end;
Dido (2003-11-07 02:27:00) [8]
А можно пример, что-то я не понял...
wicked (2003-11-07 01:10:00) [9]
ой... забыл добавить в список TControl.WindowProc...
:)
wicked (2003-11-07 01:09:00) [10]
см. справку по
TWinControl.Handle, TMessage, WM_LBUTTONDOWN/WM_LBUTTONUP
а вообще-то довольно простая задача... ;)
Dido (2003-11-07 00:33:00) [11]
Помогите пожалуйста!
DriveSoft (2003-11-07 00:07:00) [12]
Удалено модератором
Dido (2003-11-06 23:27:00) [13]
Удалено модератором