win32 c ++ обнаруживает «ввод» в элементе управления редактирования с подклассами? - PullRequest
5 голосов
/ 03 января 2011

По сути, я хочу, чтобы Enter вызывал сообщение, которое я могу поймать, когда элемент управления редактирования сфокусирован и пользователь нажимает ввод. Кажется, что все решения в Интернете касаются подклассов, но мне было интересно, есть ли другой способ обойти это?

Например, моя кнопка имеет идентификатор ID_BUTTON_SEND. Вот как я это себе представляю;

case WM_COMMAND:
     switch (LOWORD(wParam))
            case ID_BUTTON_SEND
                 if ('enter was pressed') 
                      do this
                 else
                      default

... вы поняли :) Я прочитал http://support.microsoft.com/kb/102589, но, честно говоря, вариант 1 не имеет особого смысла для меня.

Приветствия

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Вы можете перехватить событие изменения фокуса, и когда элемент управления для редактирования получает событие фокуса, просто измените кнопку диалога по умолчанию на кнопку * ID_BUTTON_SEND *.Затем, когда фокус потерян, удалите этот флаг кнопки по умолчанию.

Это будет означать, что всякий раз, когда пользователь нажимает ввод, когда у элемента управления редактирования есть ошибки, диалоговое окно автоматически запускает кнопку * ID_BUTTON_SEND * по умолчанию.

Вы можете сделать кнопку кнопкой по умолчанию , добавив BS_DEFPUSHBUTTON к GWL_STYLE кнопки.

3 голосов
/ 03 января 2011

Лучший способ это уловить - до вызова TranslateMessage.Итак, если вы используете MFC, переопределите CWnd :: PreTranslateMessage.Если вы используете только Win API, просто проверьте в своем почтовом насосе, что это сообщение, перед вызовом TranslateMessage.

2 голосов
/ 01 июля 2011

Просто чтобы повторить статью КБ. Для варианта 1 вы можете просто обработать IDOK в WM_COMMAND.

case WM_COMMAND:
  if(wParam == IDOK){
     ENTER WAS PRESSED
  }else{
    REGULAR EVENT HANDLING
  }

Это гораздо более простой и понятный способ проверки ввода.

...