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

Вниз

Что делает 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.01 c
1-1122457835
Verder
2005-07-27 13:50
2005.08.14
Длина тела функции


14-1121764709
reticon
2005-07-19 13:18
2005.08.14
Загрузка процессора и svchost.exe


14-1121180219
Peleng
2005-07-12 18:56
2005.08.14
PLS!!! СОМ-порт, асм-программирование.


1-1122025634
Destroyer
2005-07-22 13:47
2005.08.14
Проблема с вызовом переменной из другого юнита.


14-1121786453
Керк
2005-07-19 19:20
2005.08.14
Изобретение велосипедов non-stop





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский