![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что делает CallWindowProc [D5, Win95/98]
MegaVolt © (2005-06-23 11:19:00)Подскажите что делает функция CallWindowProc.
Анализируя работу модуля ComCtrls и Control обнаружил интересную особенность.
В одном случае я нажимаю кнопку мыши прога что то делает потом вызывает CallWindowProc и не возвращается из неё до тех пор пока я кнопку не отпущу.
А в другом случае возвращается практически сразу.
Почему может быть такое?
GrayFace (2005-06-23 20:23:00) [1]MegaVolt © (23.06.05 11:19)
В одном случае я нажимаю кнопку мыши прога что то делает потом вызывает CallWindowProc и не возвращается из неё до тех пор пока я кнопку не отпущу.
Как это? Пока не отпустишь, прога находится в зависшем состоянии??
PVOzerski (2005-06-23 12:20:00) [2]>После выхова inherited я почему то попадаю на >TWinControl.DefaultHandler который и вызывает CallWindowProc()
Логично. Если обработчик сообщения не имеет перекрытого аналога в классе-предке, inherited-методом считается DefaultHandler.
MegaVolt (2005-06-23 11:58:00) [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 при нажатии мыши вниз?
Готов выложить весь тестовый пример.
Digitman (2005-06-23 11:45:00) [4]
> Почему может быть такое?
очевидно потому что в том и в другом случае в CallWindowProc() передаются различные параметры
PVOzerski (2005-06-23 11:43:00) [5]Дык это зависит от того, что передано ей первым параметром :)
Вообще-то смысл этой функции в том, чтобы вызвать оконный обработчик сообщений. Обычно используется при использовании подмененных на свои WndProc'ов (в смысле WinAPI) - примерно так, как в DOS-е обработчики прерываний нередко вызывают старые векторы. Или как в Object Pascal методы классов-наследников могут вызывать inheritedпредка.
Типичный случай использования этой функции - после подмены WndProc на новый с помощью SetWindowLong. Новый обработчик проанализировал сообщение, его параметры - и (по крайней мере, если это не то сообщение, которое его интересует) отдал его на дальнейшую обработку старому обработчику. И какое уж поведение заложено в этом старом обработчике - на совести его автора.