> Не ошибаются только правильно запрограммированные компьютеры
ни фига, и они тоже ошибаются... например тот же VxWorks тогда сбойнул... наверное по той же причине, почему до сих пор на космических станциях используются "большие" микросхемы...
Ох млин, CyRax'у объяснить оказалось тяжелей всего...
Пытаюсь объяснить свою точку зрения:
При CallWindowProc все происходит именно так как ты и написал! И оно правильно!
Теперь, при использовании DefWindowProc мы передаем управление не нашей старой оконной процедуре, а стандартному виндовому обработчику. При этом код нашей старой оконной процедуры - не вызывается, он бесполезен!
При том что мы не знаем что там в ту процедуру понапихано, а знам нам это собственно особо и не надо, мы не можем предугадать поведение нашего окошка, да и вообще всей программы... Разумеется оно работать будет, но так-ли как задумано!
Я не хотел указывать на ошибки, но раз ты настаиваешь:
По моему тут нет разницы. Что CallWindowProc с адресом родной процедуры, что DefWindowProc c хендлом окна делают одно и тоже.
1. Default Window Procedure - это ни как ни есть родная оконная процедура.
2. CallWindowProc по адресу вызывает тот код, указатель на который ты передашь. DefWindowProc никак уж не вызывает оконную процедуру по хандлу окошка, иначе бы ты просто зациклился и был бы у тебя stack overflow... Она попросту вызывает виндовый обработчик по умолчанию, игнорирует оконную процедуру что была когда-то родной!
Думается мне не станем разводить тут дискуссию что я не прав, т.к. в моих предположениях есть хотя-бы логика, гипотеза... а взамен моему никто ничего не предлагал, и это верно, т.к. если построить логическую цепочку иначе, где-нить да и ждет вас обрыв...
Чето не очень...
Представим такое:
Есть цепочка NewProc-VBWindowProc-DefWindowProc
NewProc - то, что мы пишем сами,
VBWindowProc - VB-шный обработчик,
DefWindowProc - системный обработчик.
VBWindowProc ведь наверняка не все сообщения обрабатывает, к примеру только те, для которых описаны какие-либо события.
Если мы обрабатываем сообщение (например wm_command) в NewProc с целью изменить ход событий, расписанный, к примеру в Command_Click (VBWindowProc), то после обработки надо вызывать DefWindowProc, чтобы предотвратить выполнение действия, описанного в _Click.
Если же в NewProc обрабатывается сообщение, которое не описано в каких-либо событиях (например, wm_dropfile), то можно вызывать после обработки как DefWindowProc, так и VBWindowProc, из которой сообщение необработанное сквозняком попадёт в DefWindowProc.
Т.е. если мы беремся за обработку сообщения, то даже очень логично передать после обработки управление в DefWindowProc, иначе зачем было вообще обрабатывать, зная что VBWindowProc может переиначить наши действия и свести их на нет.
Если сообщение в NewProc обрабатывается, то надо вызывать DefWindowProc, если же оно не обрабатывается, то VBWindowProc.