Как обработать нажатие Enter в edit box'е?
От: Игорь Вартанов Ниоткуда  
Дата: 23.06.02 21:41
Оценка: 23 (4)
Статья:
Как обработать нажатие Enter в edit box'е?
Автор(ы): Игорь Вартанов
Дата: 04.02.2002


Авторы:
Игорь Вартанов

Аннотация:
---
С уважением,
Игорь
WM_GETDLGCODE
От: Dmitry Ostrikov  
Дата: 24.06.02 21:41
Оценка:
Для окна расположенного на диалоге, можно проанализировать lParam, который содержит информацию о мессадже WM_KEYDOWN и вернуть DLGC_WANTMESSAGE.
Re: WM_GETDLGCODE
От: Heyyou Россия  
Дата: 07.04.04 04:09
Оценка:
Здравствуйте, Dmitry Ostrikov, Вы писали:

DO>Для окна расположенного на диалоге, можно проанализировать lParam, который содержит информацию о мессадже WM_KEYDOWN и вернуть DLGC_WANTMESSAGE.


а работает? чего-то у меня не получалось, а может что написал криво. Примерчик с кодом можно?
Re: Как обработать нажатие Enter в edit box'е?
От: Heyyou Россия  
Дата: 07.04.04 04:13
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>Статья:



ИВ>Авторы:

ИВ> Игорь Вартанов

ИВ>Аннотация:


Для диалога можно задать accelerator на Enter, и в оконной процедуре диалога ловить его, затем смотреть на каком поле стоит фокус, и соответственно работать уже с этим полем
Re: Как обработать нажатие Enter в edit box'е?
От: Аноним  
Дата: 19.02.05 13:59
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>Статья:



ИВ>Авторы:

ИВ> Игорь Вартанов

ИВ>Аннотация:


Как заметил товарищь в посте http://www.rsdn.ru/Forum/Message.aspx?mid=856366&only=1
Автор: Misaw
Дата: 18.10.04

можно использовать WM_GETDLGCODE.

Методика работает без необходимости выставлять стиль ES_MULTILINE.

А именно, для mfc необходимо:

Создать класс-наследник от CEdit, положим СMyEdit
и добавить обработчики:


UINT CMyEdit::OnGetDlgCode() 
{
    return DLGC_WANTALLKEYS; // Для перехвата всех клавиш в контроле
}

void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    if(nChar == VK_RETURN)
    {
        // обрабатываем нажатие Enter

        return; // запрет обработки по умолчанию
    }
    
    CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}


Затем просабклассировать, объект созданного класса на CEdit лежащий в диалоге, с помощью SubclassDlgItem и все.
Re[2]: WM_GETDLGCODE
От: Little  
Дата: 21.02.05 03:46
Оценка:
Здравствуйте, Heyyou, Вы писали:

H>а работает? чего-то у меня не получалось, а может что написал криво. Примерчик с кодом можно?


case DM_GETDEFID:
{
if (fEditFocus && (0x8000 & GetKeyState(VK_RETURN)))
{
PostMessage(hdlg, WM_COMMAND, MAKEWPARAM(IDC_SEARCH,0), 0);
fEditFocus=FALSE;
}
return TRUE;
}
Re: Как обработать нажатие Enter в edit box'е?
От: kero Россия  
Дата: 10.08.05 08:05
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>Начнем с того, что для обработки нажатия Enter необходимо, чтобы (в общем случае) окно редактирования ожидало этого нажатия

ИВ>(т.е. имело стиль ES_MULTILINE). В противном случае система выполнит трансляцию этого нажатия в нажатие кнопки родительского окна,
ИВ>имеющей в текущий момент стиль BS_DEFAULTPUSHBUTTON. Кстати, это довольно неплохая методика для диалога, содержащего единственное окно ввода
ИВ>и имеющего кнопку по-умолчанию OK. Если же диалог (или окно) имеет несколько окон ввода, и логика работы приложения подразумевает, что нажатие Enter
ИВ>означает окончание ввода в выбранном окне и перевод фокуса на следующее, то скорее всего вам подойдет нижеследующая методика.
...
ИВ>Не всегда целесообразно обработку нажатия Enter возлагать на окно редактирования. Если в поведение приложения необходимо добавить указанную реакцию,
ИВ>но для самого окна достаточно обычной функциональности (однострочное окно редактирования), можно, не меняя стиля окна редактирования, самостоятельно
ИВ>обрабатывать нажатие Enter, анализируя содержимое сообщений в цикле обработки сообщений.
ИВ>Необходимо помнить, что цикл обработки сообщений модального диалога реализуется самой системой и недоступен для программиста. В этом случае остается
ИВ>единственное средство — подмена оконной процедуры окна редактирования, описанная выше (см. Основной вариант).


За бортом оказалась очень простая практика без всякого сабклассирования:

если диалог именно модальный (например — по DialogBoxParam),
все окна редактирования именно БЕЗ ES_MULTILINE,
кнопки с bs_DEFpushbutton вообще нет,
как и контролов с ID =IDOK, —

то все решается в DlgProc по WM_COMMAND и тесту на фокус.

(MSDN -> Dialog Boxes -> Dialog Box Programming Considerations -> Dialog Box Keyboard Interface)
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Как обработать нажатие Enter в edit box'е?
От: Аноним  
Дата: 31.08.05 15:13
Оценка:
return CallNextHookEx( WH_MSGFILTER, code, wParam, lParam );

no comment
Re[2]: Как обработать нажатие Enter в edit box'е?
От: Игорь Вартанов Ниоткуда  
Дата: 31.08.05 15:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>return CallNextHookEx( WH_MSGFILTER, code, wParam, lParam );


А>no comment


Sorry, my fault.
---
С уважением,
Игорь
Re: Как обработать нажатие Enter в edit box'е?
От: Calc Россия  
Дата: 01.09.05 09:03
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>Статья:

ИВ>Как обработать нажатие Enter в edit box'е?
Автор(ы): Игорь Вартанов
Дата: 04.02.2002


ИВ>Авторы:

ИВ> Игорь Вартанов

ИВ>Аннотация:


Не смотрите на эту статью как на статью про CEDit, иногда приходится ловить сообщения и от других элементов, а когда сообщений много, тогда легче наследовать.
Не все элементы могут быть в диалог, etc...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.