Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизКак создать обработчик события OnMouseClick у компонента Animate? Найти похожие ветки
← →
Dido (2003-11-06 22:32) [0]Заранее благодарен!
← →
Dido (2003-11-06 23:27) [1]Удалено модератором
← →
DriveSoft (2003-11-07 00:07) [2]Удалено модератором
← →
Dido (2003-11-07 00:33) [3]Помогите пожалуйста!
← →
wicked (2003-11-07 01:09) [4]см. справку по
TWinControl.Handle, TMessage, WM_LBUTTONDOWN/WM_LBUTTONUP
а вообще-то довольно простая задача... ;)
← →
wicked (2003-11-07 01:10) [5]ой... забыл добавить в список TControl.WindowProc...
:)
← →
Dido (2003-11-07 02:27) [6]А можно пример, что-то я не понял...
← →
wicked (2003-11-07 13:17) [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;
← →
wicked (2003-11-07 13:21) [8]ой... дурная сишная привычка...
вместо
> MapWindowPoints( NULL, Animate1.Handle, @pt, 1);
надо читать
> MapWindowPoints( nil, Animate1.Handle, @pt, 1);
или
> MapWindowPoints( 0, Animate1.Handle, @pt, 1);
← →
DillerXX (2003-11-07 13:39) [9]Я не понял, кто даёт сообщение и вызывает MyWndProc(var Msg: TMessage) ?
← →
wicked (2003-11-07 13:45) [10]читай внимательно - цитирую:
> { инициализация }
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> fOldProc := Animate1.WindowProc;
> Animate1.WindowProc := MyWndProc;
> end;
то есть MyWndProc вызывается при приходе любого сообщения на компонент...
← →
Dido (2003-11-07 15:11) [11]Всеравно не вышло...
Вот код:
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.
← →
Dido (2003-11-07 15:36) [12]А все уже понял, спасибо всем!
← →
Dido (2003-11-07 15:48) [13]Единственное что, пишет предупреждение: [Warning]method "WndProc" hides virtual method of base type "TCustomForm"
Что это значит, и может нужно что-то исправить...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c