покажите где в оконной процедуре идёт обработка сообщения WM_CHAR?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 27 сен 2011.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Имеем туториал Айзелиона N9 и там такая оконная процедура

    Код (Text):
    1. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    2.     .IF uMsg==WM_DESTROY
    3.         invoke PostQuitMessage,NULL
    4.     .ELSEIF uMsg==WM_CREATE
    5.         invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
    6.         WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,\
    7.                         0,35,200,25,hWnd,EditID,hInstance,NULL
    8.         mov  hwndEdit,eax
    9.         invoke SetFocus, hwndEdit
    10.     .ELSE
    11.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    12.         ret
    13.     .ENDIF
    14.     xor    eax,eax
    15.     ret
    16. WndProc endp
    17. end start
    Я её упростил донельзя
    Вот обратите внимание, эта оконная процедура обрабатывает всего два вида сообщения, WM_DESTROY, WM_CREATE, причём реакция известна на оба, в первом случае окно закрывается, во втором создаётся дочернее окно и всё. Но вот что интересно, Айзелион добавил в конце туториала:

    "И напоследок. Hе забудьте функцию TranslateMessage в очеpеди сообщений. Так как вам нужно печатать текст в edit box'е, ваша пpогpамма должна тpанслиpовать ввод в читабельный текст. Если вы пpопустите эту функцию, вы не сможете напечатать что-либо в вашем edit box'е. "

    Так, минутку. TranslateMessage генерит WM_CHAR и посылает его окну. А где же тут обработка этого сообщения? Её нет, а меж тем, текст выводится! Почему? Помогите разобраться пожалуйста! Спасибо.
     
  2. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    наверное здесь - DefWindowProc. Неотловленные чары она посылает детям. А дите - оно предопределенного виндовкласса, у него предопределенный обработчик.
     
  3. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Не наверное, а так и есть. DefWindowProc выполняет далеко не простую работу. В данном случае она отлавливает WM_CHAR и перенаправляет это сообщение окну, имеющему фокус ввода (GetFocus).
    Другой пример (самый простой): если WM_CLOSE попадает в DefWindowProc, она вызывает DestroyWindow и вы получаете WM_DESTROY. Если вы сами обрабатываете WM_CLOSE, не передавая управление DefWindowProc и не вызывая DestroyWindow, сообщения WM_DESTROY вы не получите.
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    спасибо большое
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ezrah
    Уточнение: сама по себе DefWindowProc ничего не "перенаправляет", а просто вызывает дефолтную функцию переданного ей окна hWnd. Соотв-но "ручками" через PostMessage можно послать WM_CHAR любому окну, в т.ч. и не имеющему фокуса.
    Какое окно находится в фокусе система решает уже на уровне посылки WM_KEYDOWN\WM_KEYUP, а TranslateMessage и DefWindowProc просто генерят и направляют WM_CHAR тому же самому окну, которому поступило сообщ-е WM_KEY..
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    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
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Одна неверная посылка и все прицепились к DefWindowProc... :)
    Она ничего детям не отправляет. Сообщения, предназначенные дочерним окнам в функцию родительского окна, а следовательно и в DefWindowProc (в примере выше), не попадают.
    DispatchMessage передает сообщение в соответствующую хендлу окна wndproc.

    amvoz
    Обработчик WM_CHAR контрола edit находится в оконной функции контрола edit (где-то в user32.dll)
     
  8. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    хм, точно. Беру слова обтратно, ступил :)