Обработка enter в редактируемой области comboboxex-а

Тема в разделе "WASM.WIN32", создана пользователем Toog, 25 сен 2005.

  1. Toog

    Toog New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2005
    Сообщения:
    5
    Адрес:
    Russia
    Нужно обработать нажатие клавиши enter в редактируемой области COMBOBOXEX:
    Код (Text):
    1. INVOKE SendMessage,hCombo,CBEM_GETEDITCONTROL,NULL,NULL
    2. mov hEdit,eax
    3. INVOKE SetWindowLong,hEdit,GWL_WNDPROC,OFFSET ComboEditProc
    4. mov OldComboEditProc,eax




    далее


    Код (Text):
    1. ComboEditProc PROC hDlg:HWND,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM
    2.     mov eax,uMsg
    3.     .if eax==WM_KEYDOWN
    4.         mov eax,wParam
    5.         .if al==VK_RETURN
    6.             ;----------------- [Обработка нажатия ENTER] --------------------
    7.             INVOKE SendMessage,ComboOwner,WM_COMMAND,BN_CLICKED,IDC_REN_ADDTEMPL
    8.         .else
    9.             INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam
    10.             ret
    11.        .endif
    12.     .else
    13.         INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam
    14.         ret
    15.     .endif
    16.     xor eax,eax
    17.     ret
    18. ComboEditProc endp




    WM_KEYDOWN обрабатывается, а VK_RETURN - нет.

    Как заставить это работать?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Toog

    Диалог?
     
  3. Toog

    Toog New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2005
    Сообщения:
    5
    Адрес:
    Russia
    Да, combobox на диалоге, диалог на tabcontrol, tabcontrol на диалоге, использующемся как основное окно.
     
  4. Toog

    Toog New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2005
    Сообщения:
    5
    Адрес:
    Russia
    Если сабклассить сам COMBOBOXEX, то VK_RETURN и тут не отлавливается.WM_NOTIFY -> NM_RETURN от EDIT тоже отсутствует.

    Пробовал устанавливать обработчик WM_NOTIFY (без всякого сабклассинга) в процедуре диалога на NM_RETURN - не помогает.

    Может другой какой контрол попробовать?
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    в edit'е на ListView'е на диалогах работает:
    Код (Text):
    1.  
    2. ...
    3.  .elseif e_uMsg==WM_GETDLGCODE
    4.   .if e_wParam == VK_RETURN
    5.    inva_win GetParent, hEdit_lv
    6.    inv_win PostMessage, hEdit_lv, WM_KILLFOCUS, eax, 0
    7.    or eax, -1
    8.    ret
    9.   .elseif e_wParam==VK_ESCAPE
    10.    inv_win SendMessage, hEdit_lv, WM_SETTEXT, 0, OF tx_ed_old
    11.    inva_win GetParent, hEdit_lv
    12.    inv_win PostMessage, hEdit_lv, WM_KILLFOCUS, eax, 0
    13.    or eax, -1
    14.    ret
    15.   .endif
    16. ...
    17.  
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    мож попробовать установить стиль es_wantsreturn (или как там он...)
     
  7. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
  8. Toog

    Toog New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2005
    Сообщения:
    5
    Адрес:
    Russia
    Спасибо, yureckor.

    Теперь все выглядит так (вдруг кому понадобится):
    Код (Text):
    1.  INVOKE SendMessage,hCombo,CBEM_GETEDITCONTROL,NULL,NULL
    2. mov hEdit,eax
    3. INVOKE SetWindowLong,hEdit,GWL_WNDPROC,OFFSET ComboEditProc
    4. mov OldComboEditProc,eax
    5.  
    6. ...
    7.  
    8. ComboEditProc PROC hDlg:HWND,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM
    9.     mov eax,uMsg
    10.     .if eax==WM_GETDLGCODE
    11.         .if wParam == VK_RETURN
    12.                    ;ваш код
    13.         .else
    14.             INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam
    15.             ret
    16.         .endif
    17.      .else
    18.         INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam
    19.         ret
    20.     .endif
    21.     xor eax,eax
    22.     ret
    23. ComboEditProc endp
     
  9. Toog

    Toog New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2005
    Сообщения:
    5
    Адрес:
    Russia
    shoo





    ES_WANTRETURN

    Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiline edit control in a dialog box. If you do not specify this style, pressing the ENTER key has the same effect as pressing the dialog box's default push button. This style has no effect on a single-line edit control.

    http://msdn.microsoft.com/library/d...s/editcontrolreference/editcontr olstyles.asp
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ну вот, цитаты из библии :) если хочешь субклассировать эдит и отловить в нем нажатие энтер - нужно применять этот стиль (или даже оба 8) а вообще я же поправился - по ссылке на форуме лежит имитатор командной строки как в тотале - комбобокс, нажимаешь энтер - получаешь выполнение. автор не я, поэтому не могу выложить "от себя". ключевой момент там - в субклассирующей процедуре отловить сообщение WM_GETDLGCODE и вернуть ему DLGC_WANTALLKEYS, тогда через оконную процедуру комбобокса будут пропускаться все нажатия клавиш (в тч энтер).
     
  11. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    кстати, раньше я тоже парился с отловом нажатия Enter'а в edit'е, и сабклассировал его. А ща нашел случайно (верней знал эффект давно, но не задумывался), что в родительский диалог приходит IDM с кодом 1.
    Код (Text):
    1.  
    2.  .elseif eax==WM_COMMAND
    3.   mov eax, [wParam]
    4.   and eax, 0FFFFh
    5.   .if [lParam]==0
    6.    ;--------------------------------IDM_
    7.    ;--------------------------------IDM_OPEN
    8.    .if eax==IDM_OPEN
    9.     ...
    10.    ;--------------------------------IDM_ENTER?
    11.    .elseif eax==1
    12.     ...  
    13.  
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    а на ESC - 2
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я этот момент использовал для выбора кнопки по умолчанию (см wafasm - Go All) - есть разница, чем вызывался диалог - мышью или клавиатурой, и у меня получалась кнопка "текущая" одна, а нажималась от энтера другая 8) - пришлось отлавливать единицу и "нажимать" самому