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

Вниз

Что делает CallWindowProc   Найти похожие ветки 

 
MegaVolt ©   (2005-06-23 11:19) [0]

Подскажите что делает функция CallWindowProc.
Анализируя работу модуля ComCtrls и Control обнаружил интересную особенность.
В одном случае я нажимаю кнопку мыши прога что то делает потом вызывает CallWindowProc и не возвращается из неё до тех пор пока я кнопку не отпущу.
А в другом случае возвращается практически сразу.

Почему может быть такое?


 
PVOzerski ©   (2005-06-23 11:43) [1]

Дык это зависит от того, что передано ей первым параметром :)

Вообще-то смысл этой функции в том, чтобы вызвать оконный обработчик сообщений. Обычно используется при использовании подмененных на свои WndProc"ов (в смысле WinAPI) - примерно так, как в DOS-е обработчики прерываний нередко вызывают старые векторы. Или как в Object Pascal методы классов-наследников могут вызывать inherited предка.

Типичный случай использования этой функции - после подмены WndProc на новый с помощью SetWindowLong. Новый обработчик проанализировал сообщение, его параметры - и (по крайней мере, если это не то сообщение, которое его интересует) отдал его на дальнейшую обработку старому обработчику. И какое уж поведение заложено в этом старом обработчике - на совести его автора.


 
Digitman ©   (2005-06-23 11:45) [2]


> Почему может быть такое?


очевидно потому что в том и в другом случае в CallWindowProc() передаются различные параметры


 
MegaVolt ©   (2005-06-23 11:58) [3]

Сообщение одно и то же. Значит дело в хендллах?

Я анализировал функцию
procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
 SendCancelMode(Self);
 inherited;
 if csCaptureMouse in ControlStyle then MouseCapture := True;
 if csClickEvents in ControlStyle then Include(FControlState, csClicked);
 DoMouseDown(Message, mbLeft, []);
end;

После выхова inherited я почему то попадаю на TWinControl.DefaultHandler который и вызывает  CallWindowProc()

Саму функцию TWinControl.DefaultHandler проанализировать используя логи не могу очень уж она часто вызывается :( Но в TControl.WMLButtonDown класс один и тот же TListView

И нажимаю я на Item в одном случае а во втором на CheckBox этого Item.

Господа помогите разобратся откуда возникает лишний вызов OnMouseUp при нажатии мыши вниз?

Готов выложить весь тестовый пример.


 
PVOzerski ©   (2005-06-23 12:20) [4]

>После выхова inherited я почему то попадаю на >TWinControl.DefaultHandler который и вызывает  CallWindowProc()
Логично. Если обработчик сообщения не имеет перекрытого аналога в классе-предке, inherited-методом считается DefaultHandler.


 
GrayFace ©   (2005-06-23 20:23) [5]

MegaVolt ©   (23.06.05 11:19)
В одном случае я нажимаю кнопку мыши прога что то делает потом вызывает CallWindowProc и не возвращается из неё до тех пор пока я кнопку не отпущу.

Как это? Пока не отпустишь, прога находится в зависшем состоянии??



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

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

Наверх




Память: 0.48 MB
Время: 0.043 c
3-1120548686
DDDeN
2005-07-05 11:31
2005.08.14
Начало работы с InterBase


8-1113129692
Дятел-45
2005-04-10 14:41
2005.08.14
Можно ли получить изображение из веб-камеры в Delphi?


1-1121423160
Виталька2005
2005-07-15 14:26
2005.08.14
Обработка текста в MaskEdit


1-1122352675
Demidoff
2005-07-26 08:37
2005.08.14
Как исправить кодировку при сохранении в файл?


6-1115226291
olevacho_
2005-05-04 21:04
2005.08.14
журнал посещений страниц на Делфи