Друзья! Имеем туториал Айзелиона N9 и там такая оконная процедура Код (Text): WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_CREATE invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\ WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,\ 0,35,200,25,hWnd,EditID,hInstance,NULL mov hwndEdit,eax invoke SetFocus, hwndEdit .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start Я её упростил донельзя Вот обратите внимание, эта оконная процедура обрабатывает всего два вида сообщения, WM_DESTROY, WM_CREATE, причём реакция известна на оба, в первом случае окно закрывается, во втором создаётся дочернее окно и всё. Но вот что интересно, Айзелион добавил в конце туториала: "И напоследок. Hе забудьте функцию TranslateMessage в очеpеди сообщений. Так как вам нужно печатать текст в edit box'е, ваша пpогpамма должна тpанслиpовать ввод в читабельный текст. Если вы пpопустите эту функцию, вы не сможете напечатать что-либо в вашем edit box'е. " Так, минутку. TranslateMessage генерит WM_CHAR и посылает его окну. А где же тут обработка этого сообщения? Её нет, а меж тем, текст выводится! Почему? Помогите разобраться пожалуйста! Спасибо.
наверное здесь - DefWindowProc. Неотловленные чары она посылает детям. А дите - оно предопределенного виндовкласса, у него предопределенный обработчик.
Не наверное, а так и есть. DefWindowProc выполняет далеко не простую работу. В данном случае она отлавливает WM_CHAR и перенаправляет это сообщение окну, имеющему фокус ввода (GetFocus). Другой пример (самый простой): если WM_CLOSE попадает в DefWindowProc, она вызывает DestroyWindow и вы получаете WM_DESTROY. Если вы сами обрабатываете WM_CLOSE, не передавая управление DefWindowProc и не вызывая DestroyWindow, сообщения WM_DESTROY вы не получите.
Ezrah Уточнение: сама по себе DefWindowProc ничего не "перенаправляет", а просто вызывает дефолтную функцию переданного ей окна hWnd. Соотв-но "ручками" через PostMessage можно послать WM_CHAR любому окну, в т.ч. и не имеющему фокуса. Какое окно находится в фокусе система решает уже на уровне посылки WM_KEYDOWN\WM_KEYUP, а TranslateMessage и DefWindowProc просто генерят и направляют WM_CHAR тому же самому окну, которому поступило сообщ-е WM_KEY..
amvoz Можно еще упростить. Попробуйте убрать xor eax,eax перед RET, и, так как следом за invoke DefWindowProc идет ret, а DefWindowProc передаются те же параметры, что и WndProc (hWnd, uMsg, wParam, lParam) достаточно вместо invoke DefWindowProc, hWnd, uMsg, wParam, lParam/ret поставить leave/jmp DefWindowProc смотрите Сам себе Iczelion #20 и #37
Одна неверная посылка и все прицепились к DefWindowProc... Она ничего детям не отправляет. Сообщения, предназначенные дочерним окнам в функцию родительского окна, а следовательно и в DefWindowProc (в примере выше), не попадают. DispatchMessage передает сообщение в соответствующую хендлу окна wndproc. amvoz Обработчик WM_CHAR контрола edit находится в оконной функции контрола edit (где-то в user32.dll)