Как се използва клавишът ENTER от "Редактиране на контроли" в диалоговия прозорец

Обобщена информация

Приложенията, базирани на Windows, често показват диалогови прозорци за въвеждане на данни, за да поискат информация от потребители. Тези диалогови прозорци може да съдържат няколко контроли за редактиране и два бутона за Command (Push), означени OK и CANCEL. Пример за диалогов прозорец за въвеждане на данни е този, който изисква лични данни, като например номер на социална осигуровка, адрес, идентификационен номер (ИД), дата/час и т. н., от потребители. Всеки от тези елементи е въведен в контрола за редактиране. По подразбиране клавишът TAB се използва в диалоговия прозорец, за да се премести фокусът между контролите за редактиране. Като обикновен потребителски интерфейс обаче, може да се използва и клавишът ENTER (return), за да се придвижвате между контролите за редактиране (например след като потребителят въведе част от информацията, натискането на клавиша ENTER премества фокуса към следващото поле). Има няколко начина за разрешаване на използването на клавиша ENTER, за да се придвижат между контроли за редактиране. Един от методите е да се възползвате от WM_COMMAND и уведомителните съобщения, които са с него, в диалоговия прозорец за редактиране на контроли и бутони. Друг метод включва подкласификация на контролите за редактиране. Третата включва използването на съветника за приложения и на класа и създаването на нов член на диалогов прозорец.

Повече информация

Метод I: (WM_COMMAND)

Този метод се базира на следното поведение на диалогови прозорци (диалогови прозорци) и управление на фокуса в Windows. Ако даден диалогов прозорец или един от контролите му в момента има фокуса на въвеждане, тогава натискането на клавиша ENTER кара прозорците да изпратят WM_COMMAND съобщение с параметър idItem (wParam), зададен на ИД на командния бутон по подразбиране. Ако в диалоговия прозорец няма команден бутон по подразбиране, тогава параметърът idItem е зададен на IDOK по подразбиране. Когато дадено приложение получи WM_COMMAND съобщение с idItem, зададено на ИД на командния бутон по подразбиране, фокусът остава върху контролата, която е поставила фокуса преди натискане на клавиша ENTER. Извикване на GetFocus () в този момент връща манипулатора на контролата, която е била с фокус преди натискане на клавиша ENTER. Приложението може да провери този манипулатор за управление и да определи дали то принадлежи към който и да е от контролите за редактиране в диалоговия прозорец. Ако е така, потребителят е въвеждал данни в една от контролите за редактиране и след това е натиснал ENTER. В този момент приложението може да изпрати WM_NEXTDLGCTL съобщение в диалоговия прозорец, за да се премества фокусът върху следващата контрола. Ако обаче фокусът е върху един от командните бутони (отказ или OK), тогава GetFocus () връща манипулатор за управление на бутон, след което един може да отхвърли диалоговия прозорец. Псевдо кодът за тази логика наподобява следното в процедурата на диалоговия прозорец на приложението:

     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 ;

Метод ІІ

Този метод включва подкатегория/прекласифициране на контролата за редактиране в диалоговия прозорец. След като контролите за редактиране са подкласени или прекласифицирани, всички клавишни входове се изпращат в процедурата за подклас/superclass на контролата за редактиране, която в момента има фокус върху въвеждане, независимо дали диалоговият прозорец има команден бутон по подразбиране. Приложението може да залови съобщения с клавиш надолу (или чар), потърсете клавиша ENTER и съответно Направете обработката. По-долу е описана процедура за подгрупа, която търси клавиша ENTER:

   //*-------------------------------------------------------------------   //| 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

Този метод включва използването на приложението студио и ClassWizard и създаване на нов член на диалоговия прозорец. Този метод ще позволява на потребителя да натиска клавиша ENTER и да насочва фокуса към следващата контрола за редактиране. Ако в момента фокусът е върху контролата за Последна промяна в диалоговия прозорец, фокусът ще премине към първо управление на редактирането. Първо, използвайте студио за приложения, за да промените ИД на бутона "OK" на диалоговия прозорец. Поведението по подразбиране на приложението Studio е да се даде бутонът OK ИД IDOK. ИД на бутона за OK трябва да се промени на друга стойност, като например IDC_OK. Можете също да промените свойствата на бутона OK, така че да не може да бъде натискан по подразбиране. След това използвайте ClassWizard, за да създадете нов член от диалоговия прозорец funciton. Дайте име на функцията New член нещо подобно на 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();   }

Нуждаете се от още помощ?

Разширете уменията си
Преглед на обучението
Получавайте първи новите функции
Присъединете се към Microsoft приобщени

Беше ли полезна тази информация?

Благодарим ви за обратната връзка!

×