Перейти к основному контенту
Поддержка
Войдите с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Выберите другую учетную запись.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой нужно войти.

Аннотация

В приложениях для Windows часто отображаются диалоговые окна ввода данных для запроса информации от пользователей. В этих диалоговых окнах могут содержаться несколько элементов управления редактированием и две кнопки (принудительно) с пометкой ОК и Отмена. В диалоговом окне ввода данных можно получить доступ к личным сведениям, таким как номер социального страхования, адрес, идентификационный номер, Дата и время и т. д. Каждый из этих элементов вводится в элемент управления "поле ввода". По умолчанию клавиша TAB используется в диалоговом окне для перемещения фокуса между элементами управления редактированием. Тем не менее, в качестве общего пользовательского интерфейса можно также использовать клавишу ВВОД (RETURN) для перемещения между элементами управления редактированием (например, после того, как пользователь введет фрагменты данных, при нажатии клавиши Ввод перемещает фокус на следующее поле). Существует несколько способов включения использования клавиши ВВОД для перемещения между элементами управления редактированием. Один из способов — использовать WM_COMMAND и сообщения уведомлений, которые поставляются вместе с ним в диалоговом окне для элементов управления и кнопок редактирования. Другой метод включает в себя подклассы элементов управления редактированием. Третья состоит в использовании приложения App Studio и класса и создании новой функции-члена диалогового окна.

Дополнительная информация

Метод I: (WM_COMMAND)

Этот метод основан на описанном ниже поведении диалоговых окон (диспетчер диалоговых окон) и обработке фокуса в Windows. Если в данный момент фокус находится в диалоговом окне или на одном из его элементов управления, то при нажатии клавиши Ввод система Windows отправляет WM_COMMAND сообщение с параметром idItem (wParam), которому задан идентификатор кнопки команды по умолчанию. Если диалоговое окно не имеет кнопки, используемой по умолчанию, параметр idItem по умолчанию имеет значение IDOK. Когда приложение получает WM_COMMAND сообщение с ИДЕНТИФИКАТОРом кнопки команды по умолчанию, фокус остается на элементе управления, для которого фокус установлен, прежде чем была нажата клавиша ВВОД. Вызов функции getHandler () в этой точке возвращает маркер элемента управления, в котором фокус установлен до нажатия клавиши ВВОД. Приложение может проверить этот управляющий элемент и определить, принадлежит ли он любому элементу управления редактированием в диалоговом окне. Если это так, пользователь вводит данные в один из элементов управления редактированием и после этого нажимает клавишу ВВОД. На этом этапе приложение может отправить WM_NEXTDLGCTL сообщение диалоговому окну, чтобы переместить фокус на следующий элемент управления. Тем не менее, если фокус установлен на одной из командных кнопок (Отмена или ОК), функция-Focus () возвращает управляющий маркер, после чего один из них может закрыть диалоговое окно. Псевдокод для этой логики напоминает следующие действия в диалоговом окне приложения:

     case WM_COMMAND:     if(wParam=IDOFDEFBUTTON || IDOK) {          // User has hit the ENTER key.          hwndTest = GetFocus() ;          retVal = TesthWnd(hWndTest) ;          //Where retVal is a boolean variable that indicates whether        //the hwndTest is the handle of one of the edit controls.          if(hwndTest) {         //Focus is with an edit control, so do not close the dialog.            //Move focus to the next control in the dialog.         PostMessage(hDlg, WM_NEXTDLGCTL, 0, 0L) ;         return TRUE ;          }          else {            //Focus is with the default button, so close the dialog.            EndDialog(hDlg, TRUE) ;            return FALSE ;          }        }     break ;

Способ II

Этот метод включает в себя подклассы и доработка элемента управления "поле ввода" в диалоговом окне. После того как элементы управления редактированием подклассами или суперклассами, все введенные пользователем данные отправляются на один из подклассов для элемента управления редактированием, который в данный момент имеет фокус ввода, независимо от того, содержит ли диалоговое окно командную кнопку по умолчанию. Приложение может перехватить ключевые (или символьные) сообщения, найти клавишу ВВОД и выполнить обработку соответствующим образом. Ниже приведен пример процедуры подклассов, которая выполняет поиск клавиши ВВОД.

   //*-------------------------------------------------------------------   //| Title:   //|     SubClassProc   //|   //| Parameters:   //|     hWnd            - Handle to the message's destination window   //|     wMessage        - Message number of the current message   //|     wParam          - Additional info associated with the message   //|     lParam          - Additional info associated with the message   //|   //| Purpose:   //|     This is the window procedure used to subclass the edit control.   //*---------------------------------------------------------------------   long FAR PASCAL SubProc(HWND hWnd, WORD wMessage,WORD wParam,LONG                           lParam)   {       switch (wMessage)        {             case WM_GETDLGCODE:               return (DLGC_WANTALLKEYS |                       CallWindowProc(lpOldProc, hWnd, wMessage,                                      wParam, lParam));             case WM_CHAR:             //Process this message to avoid message beeps.            if ((wParam == VK_RETURN) || (wParam == VK_TAB))              return 0;               else              return (CallWindowProc(lpOldProc, hWnd,                                        wMessage, wParam, lParam));          case WM_KEYDOWN:               if ((wParam == VK_RETURN) || (wParam == VK_TAB)) {                 PostMessage (ghDlg, WM_NEXTDLGCTL, 0, 0L);                 return FALSE;               }            return (CallWindowProc(lpOldProc, hWnd, wMessage,                                      wParam, lParam));            break ;          default:               break;        } /* end switch */ 

Способ 3

Этот метод включает в себя приложения App Studio и ClassWizard и создает новую функцию-член диалогового окна. Этот метод позволит пользователю нажать клавишу ВВОД и поместит фокус на следующий элемент управления редактированием. Если фокус находится в последнем элементе управления редактированием в диалоговом окне, фокус переместится к первому элементу управления редактированием. Сначала с помощью App Studio измените идентификатор кнопки "ОК" в диалоговом окне. Поведением по умолчанию в App Studio является предоставление кнопки ОК ID IDOK. Идентификатор кнопки ОК следует изменить на другое значение, например IDC_OK. Кроме того, измените свойства кнопки ОК таким образом, чтобы она не была кнопкой по умолчанию. Затем используйте ClassWizard, чтобы создать новый элемент диалогового окна funciton. Назовите новую функцию-член, например OnClickedOK. Эта функция должна быть связана с BN_CLICKED сообщением из элемента управления IDC_OK. Завершив это, напишите тело функции OnClickedOK. Код, который обычно помещается в функцию OnOK, нужно добавить в новую функцию OnClickedOK, включая функцию OnOK класса. Добавьте следующий прототип в заголовочный файл для диалогового окна:

   protected:      virtual void OnOK();

В диалоговом окне Добавьте функцию OnOK, а код — как показано ниже.

   void CMyDialog::OnOK()   {        CWnd* pwndCtrl = GetFocus();        CWnd* pwndCtrlNext = pwndCtrl;        int ctrl_ID = pwndCtrl->GetDlgCtrlID();        switch (ctrl_ID) {            case IDC_EDIT1:                pwndCtrlNext = GetDlgItem(IDC_EDIT2);                break;            case IDC_EDIT2:                pwndCtrlNext = GetDlgItem(IDC_EDIT3);                break;            case IDC_EDIT3:                pwndCtrlNext = GetDlgItem(IDC_EDIT4);                break;            case IDC_EDIT4:                pwndCtrlNext = GetDlgItem(IDC_EDIT1);                break;            case IDOK:                CDialog::OnOK();                break;            default:                break;        }        pwndCtrlNext->SetFocus();   }

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

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

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?
После нажатия кнопки "Отправить" ваш отзыв будет использован для улучшения продуктов и служб Майкрософт. Эти данные будут доступны для сбора ИТ-администратору. Заявление о конфиденциальности.

Спасибо за ваш отзыв!

×