Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
15-1258322580
POOP
2009-11-16 01:03
2010.01.17
Чем можно уменьшить скорость аудио?


15-1258398854
_
2009-11-16 22:14
2010.01.17
Клавиатура отказывает.


15-1258409121
Германн
2009-11-17 01:05
2010.01.17
Клиент ДМ


2-1259332789
Неважно
2009-11-27 17:39
2010.01.17
кол-во подстрок в строке


15-1258462233
kiligin
2009-11-17 15:50
2010.01.17
преобразование звука из мат функций





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский