Salt la conținutul principal
Asistență
Conectare

Cum se utilizează tasta ENTER din editare controale într-o casetă de dialog

Rezumat

Aplicațiile bazate pe Windows afișează deseori casetele de dialog introducere date pentru a solicita informații de la utilizatori. Aceste casete de dialog pot conține mai multe butoane editare controale și două comenzi (push), etichetate OK și anulare. Un exemplu de casetă de dialog intrare date este unul care solicită informații personale, cum ar fi numărul de securitate socială, adresa, numărul de identificare (ID), data/ora și așa mai departe, de la utilizatori. Fiecare dintre aceste elemente este introdus într-un control de editare. În mod implicit, tasta TAB este utilizată într-o casetă de dialog pentru a comuta focalizarea între controalele de editare. Cu toate acestea, ca interfață utilizator obișnuită, se poate utiliza și tasta ENTER (returnare) pentru a vă deplasa între controalele de editare (de exemplu, după ce utilizatorul introduce un fragment de informații, apăsând ENTER mută focalizarea la câmpul următor). Există câteva modalități de a permite utilizarea tastei ENTER pentru a vă deplasa între controalele de editare. O metodă este să utilizați WM_COMMAND și mesajele de notificare care sunt asociate cu aceasta în caseta de dialog pentru editare controale și butoane. O altă metodă implică Subclasarea controalelor de editare. O treime implică utilizarea aplicației Studio și a expertului școlar și crearea unei noi funcții membru casetă de dialog.

Mai multe informații

Metoda I: (WM_COMMAND)

Această metodă se bazează pe următorul comportament al casetelor de dialog (Manager de dialog) și pe gestionarea focalizării în Windows. dacă o casetă de dialog sau unul dintre controalele sale are în prezent focalizarea de intrare, apoi apăsând tasta ENTER determină Windows să trimită un mesaj WM_COMMAND cu parametrul idItem (wParam) setat la ID-ul butonului de comandă implicit. Dacă caseta de dialog nu are un buton de comandă implicit, atunci parametrul idItem este setat la IDOK în mod implicit. Atunci când o aplicație primește mesajul de WM_COMMAND cu idItem setat la ID-ul butonului de comandă implicit, focalizarea rămâne cu controlul care a avut focalizarea înainte să fie apăsată tasta ENTER. Apelare GetFocus () în acest moment returnează ghidajul controlului care a avut focalizarea înainte să fie apăsată tasta ENTER. Aplicația poate verifica acest ghidaj de control și determină dacă aparține oricăruia dintre controalele de editare din caseta de dialog. Dacă se întâmplă acest lucru, utilizatorul introduce date într-unul dintre controalele de editare și, după aceasta, apasă ENTER. În acest moment, aplicația poate trimite mesajul WM_NEXTDLGCTL în caseta de dialog pentru a muta focalizarea la următorul control. Cu toate acestea, dacă focalizarea a fost cu unul dintre butoanele de comandă (anulare sau OK), atunci GetFocus () returnează un ghidaj de control buton, moment în care se poate închide caseta de dialog. Codul pseudo pentru această logică seamănă cu următorul în procedura casetei de dialog a aplicației:

     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 ;

Metoda II

Această metodă implică Subclasarea/supraclasarea controlului editare în caseta de dialog. După ce controalele de editare sunt subclasificate sau supraclasificate, toate intrările de tastatură sunt trimise procedurii subclasare/supraclasă a controlului de editare care are în prezent focalizarea de intrare, indiferent dacă caseta de dialog are sau nu un buton de comandă implicit. Aplicația poate bloca mesajele cheie în jos (sau Char), căutați tasta ENTER și efectuați procesarea în mod corespunzător. Iată o procedură de subclasă eșantion care caută cheia 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 */ 

Metoda 3

Această metodă implică utilizarea aplicației Studio și ClassWizard și crearea unei noi funcții membru casetă de dialog. Această metodă va permite unui utilizator să apese tasta ENTER și să aibă focalizarea în avans la următorul control de editare. Dacă focalizarea este în prezent în ultimul control editare din caseta de dialog, focalizarea va avansa la primul control de editare. Mai întâi, utilizați App Studio pentru a modifica ID-ul butonului OK din caseta de dialog. Comportamentul implicit al aplicației Studio este să dați butonului OK ID-ul IDOK. ID-ul butonului OK trebuie modificat la o altă valoare, cum ar fi IDC_OK. De asemenea, modificați proprietățile butonului OK, astfel încât să nu fie o buton implicită. În continuare, utilizați ClassWizard pentru a crea un nou membru al casetei de dialog funciton. Denumiți noua funcție de membru ca OnClickedOK. Această funcție trebuie să fie legată de mesajul BN_CLICKED din controlul IDC_OK. După ce se termină acest lucru, scrieți corpul funcției OnClickedOK. Ar trebui să plasați codul pe care l-ați introdus în mod normal în funcția OnOK în noua funcție OnClickedOK, inclusiv funcția OnOK a clasei. Adăugați următorul prototip la fișierul antet pentru caseta de dialog:

   protected:      virtual void OnOK();

Adăugarea unei funcții OnOK la caseta de dialog și codul este așa cum s-a demonstrat mai jos:

   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();   }

Aveți nevoie de ajutor suplimentar?

Extindeți-vă competențele
Explorați instruirea
Fiți primul care obține noile caracteristici
Alăturați-vă la Microsoft Insider

V-a fost de ajutor această informație?

Cât de mulțumit sunteți de calitatea traducerii?

Ce v-a afectat experiența?

Aveți feedback suplimentar? (Opțional)

Vă mulțumim pentru feedback!

×