![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WndProc vs WindowProc [D7, XP]
Molchanov © (2009-11-26 19:36:00)Господа Мастера!
Есть потребность обрабатывать сообщения в главном окне приложения.
Создать для всех сообщений обработчики типа
procedure WMXXXX(var Msg: TMessage); message WM_XXXX;
невозможно, т.к. часть из них регистрируется RegisterWindowMessage.
Нашел два варианта.
Вариант 1:
TForm1 = class(TForm)
...
protected
procedure WndProc(var Message: TMessage); override;
...
end;
procedure TForm1.WndProc(var Message: TMessage);
begin
// Processing custom messages
// ...
inherited WndProc(Message);
end;
Вариант 2:
OldWindowProc: Pointer;
function NewWindowProc(Handle: HWND; uMsg: LongInt; ParamW: WPARAM; ParamL: LPARAM): Longint stdcall;
begin
// Processing custom messages
// ...
Result := CallWindowProc(OldWindowProc, Handle, uMsg, ParamW, ParamL);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
...
OldWindowProc := Pointer(SetWindowLong(Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
...
end;
Чем они принципиально отличаются и какой из них предпочтителен?
Очевидно, что первый вариант предоставляет доступ к полям и методам формы, а что можно сказать в пользу второго?
Molchanov (2009-11-27 09:56:00) [1]Спасибо откликнувшимся за содержательные ответы
Григорьев Антон (2009-11-27 09:40:00) [2]Посмотрите http://www.delphikingdom.com/asp/viewitem.asp?catalogid=169#07- там билже к концу раздела приводится список всех методов перехвата сообщений в VCL с обсуждением их достоинств и недостатков.
А SetWindowLong совместо с VCL лучше не использовать - там тоже написано, почему.
Leonid Troyanovsky (2009-11-27 08:58:00) [3]
> Molchanov (26.11.09 19:36)
> и методам формы, а что можно сказать в пользу второго?
Второй вариант - просто ошибочен.
Как уже сказал Игорь, надо обратить внимание на свойство WindowProc.
--
Regards, LVT.
Игорь Шевченко (2009-11-26 20:09:00) [4]
> Чем лучше?
вопрос религии.
> Чем они принципиально отличаются и какой из них предпочтителен?
Они принципиально отличаются тем, что в случае перекрытия WndProc необходимо создать наследника класса, а при замене WindowProc этого делать не обязательно.
RTFS: Controls.pas
Molchanov (2009-11-26 20:01:00) [5]
> procedure Defaulthandler (var Message); override;
Перекрывать Defaulthandlerлучше чем WndProc?
Чем лучше?
Игорь Шевченко (2009-11-26 19:51:00) [6]
> невозможно, т.к. часть из них регистрируется RegisterWindowMessage
procedure Defaulthandler (var Message); override;
http://faqs.org.ru/progr/pascal/fcdelphi.htm