Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.17;
Скачать: CL | DM;

Вниз

WndProc vs WindowProc   Найти похожие ветки 

 
Molchanov   (2009-11-26 19:36) [0]

Господа Мастера!
Есть потребность обрабатывать сообщения в главном окне приложения.
Создать для всех сообщений обработчики типа

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;  

Чем они принципиально отличаются и какой из них предпочтителен?
Очевидно, что первый вариант предоставляет доступ к полям и методам формы, а что можно сказать в пользу второго?


 
Игорь Шевченко ©   (2009-11-26 19:51) [1]


> невозможно, т.к. часть из них регистрируется RegisterWindowMessage


procedure Defaulthandler (var Message); override;

http://faqs.org.ru/progr/pascal/fcdelphi.htm


 
Molchanov   (2009-11-26 20:01) [2]


> procedure Defaulthandler (var Message); override;

Перекрывать Defaulthandler лучше чем WndProc?
Чем лучше?


 
Игорь Шевченко ©   (2009-11-26 20:09) [3]


> Чем лучше?


вопрос религии.


> Чем они принципиально отличаются и какой из них предпочтителен?


Они принципиально отличаются тем, что в случае перекрытия WndProc необходимо создать наследника класса, а при замене WindowProc этого делать не обязательно.

RTFS: Controls.pas


 
Leonid Troyanovsky ©   (2009-11-27 08:58) [4]


> Molchanov   (26.11.09 19:36)  

> и методам формы, а что можно сказать в пользу второго?

Второй вариант - просто ошибочен.
Как уже сказал Игорь, надо обратить внимание на свойство WindowProc.

--
Regards, LVT.


 
Григорьев Антон ©   (2009-11-27 09:40) [5]

Посмотрите http://www.delphikingdom.com/asp/viewitem.asp?catalogid=169#07 - там билже к концу раздела приводится список всех методов перехвата сообщений в VCL с обсуждением их достоинств и недостатков.

А SetWindowLong совместо с VCL лучше не использовать - там тоже написано, почему.


 
Molchanov   (2009-11-27 09:56) [6]

Спасибо откликнувшимся за содержательные ответы



Страницы: 1 вся ветка

Текущий архив: 2010.01.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
2-1259392755
Kuzmi4
2009-11-28 10:19
2010.01.17
Открыть новую форму, полностью переписав её


15-1258360621
ВадимММ
2009-11-16 11:37
2010.01.17
Принтерное сопло-2


2-1259181108
vlad_
2009-11-25 23:31
2010.01.17
Mdi Delphi


15-1258320614
Юрий
2009-11-16 00:30
2010.01.17
С днем рождения ! 16 ноября 2009 понедельник


10-1162481216
Note
2006-11-02 18:26
2010.01.17
COM взаимодействие службы Win32 и пользовательского приложения