Verwenden der EINGABETASTE aus Bearbeitungssteuerelementen in einem Dialog Feld


Zusammenfassung


In Windows-basierten Anwendungen werden häufig Dateneingabe Dialogfelder angezeigt, um Informationen von Benutzern anzufordern. Diese Dialogfelder enthalten möglicherweise mehrere Bearbeitungssteuerelemente und zwei Befehlsschaltflächen (Push) mit der Bezeichnung "OK" und "Abbrechen". Ein Beispiel für ein Dialogfeld für die Dateneingabe ist eine Person, die persönliche Informationen wie Sozialversicherungsnummer, Adresse, Identifikationsnummer, Datum/Uhrzeit usw. von Benutzern anfordert. Jedes dieser Elemente wird in ein Bearbeitungssteuerelement eingegeben. Standardmäßig wird die Tab-Taste in einem Dialogfeldverwendet, um den Fokus zwischen Bearbeitungssteuerelementen zu verschieben. Als allgemeine Benutzeroberfläche kann jedoch auch die EINGABETASTE (Return) verwendet werden, um zwischen den Bearbeitungssteuerelementen zu wechseln (nachdem der Benutzer beispielsweise eine Information eingegeben hat, wird durch Drücken der EINGABETASTE der Fokus auf das nächste Feld verschoben). Es gibt verschiedene Möglichkeiten, wie Sie die Eingabetaste verwenden können, um zwischen Bearbeitungssteuerelementen zu wechseln. Eine Möglichkeit besteht darin, WM_COMMAND und die darin enthaltene Benachrichtigungsmeldungen im Dialogfeld für Bearbeitungssteuerelemente und Schaltflächen zu verwenden. Eine andere Methode umfasst die Unterklasse der Bearbeitungssteuerelemente. Eine dritte umfasst die Verwendung von App Studio und des Kurs-Assistenten und das Erstellen einer neuen Memberfunktion des Dialogfelds.

Weitere Informationen


Methode I: (WM_COMMAND)

Diese Methode basiert auf dem folgenden Verhalten von Dialogfeldern (Dialogfeld-Manager) und Fokus Behandlung in Windows. Wenn ein Dialogfeld oder ein Steuerelement derzeit über den Eingabefokus verfügt, bewirkt das Drücken der EINGABETASTE, dass Windows eine WM_COMMAND Nachricht sendet, wobei der idItem (wParam)-Parameter auf die ID der Standardbefehlsschaltfläche festgesetzt ist. Wenn das Dialogfeld nicht über eine Standardbefehlsschaltfläche verfügt, wird der idItem-Parameter standardmäßig auf IDOK gesetzt. Wenn eine Anwendung die WM_COMMAND Nachricht mit idItem erhält, die auf die ID der Standardbefehlsschaltfläche festgesetzt ist, verbleibt der Fokus bei dem Steuerelement, das den Fokus hatte, bevor die EINGABETASTE gedrückt wurde. Durch Aufrufen von getFocus () wird an dieser Stelle das Handle des Steuerelements zurückgegeben, das den Fokus hatte, bevor die EINGABETASTE gedrückt wurde. Die Anwendung kann diesen Kontrollpunkt überprüfen und ermitteln, ob Sie zu einem der Bearbeitungssteuerelemente im Dialogfeld gehört. Wenn dies der Fall ist, hat der Benutzerdaten in eines der Bearbeitungssteuerelemente eingegeben und anschließend die EINGABETASTE gedrückt. An diesem Punkt kann die Anwendung die WM_NEXTDLGCTL Nachricht an das Dialogfeld senden, um den Fokus auf das nächste Steuerelement zu verschieben. Wenn sich der Fokus jedoch auf eine der Befehlsschaltflächen (Abbrechen oder OK) befand, gibt getFocus () einen Button-Steuerpunkt zurück, an dem das Dialogfeld geschlossen werden kann. Der Pseudocode für diese Logik ähnelt der folgenden in der Dialogfeldprozedur der Anwendung:
     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 ;

Methode II

Diese Methode beinhaltet das Edit-Steuerelement im Dialogfeld Unterklassen/SuperClasses. Nachdem die Bearbeitungssteuerelemente Unterklassen oder übergeordnet sind, werden alle Tastatureingaben an die Unterklasse/übergeordnete Prozedur des Bearbeitungssteuerelements gesendet, das derzeit den Eingabefokus hat, und zwar unabhängig davon, ob das Dialogfeld über eine Standardbefehlsschaltfläche verfügt. Die Anwendung kann die Schlüssel nach-unten (oder Char)-Nachrichten Trapping, suchen Sie nach der EINGABETASTE, und führen Sie die Verarbeitung entsprechend aus. Die folgende Beispiel-Unterklasse-Prozedur sucht nach der EINGABETASTE:
   //*-------------------------------------------------------------------   //| 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 */ 

Methode 3

Diese Methode umfasst die Verwendung von App Studio und Klassen und das Erstellen einer neuen Memberfunktion des Dialogfelds. Mit dieser Methode kann ein Benutzer die EINGABETASTE drücken und den Fokus auf das nächste Bearbeitungssteuerelement setzen. Wenn sich der Fokus aktuell auf dem letzten Edit-Steuerelement im Dialogfeld befindet, wird der Fokus auf das erste Bearbeitungssteuerelement weiter gestellt. Verwenden Sie zunächst App Studio, um die ID der Schaltfläche OK des Dialogfelds zu ändern. Das Standardverhalten von App Studio besteht darin, der Schaltfläche OK die ID IDOK zu geben. Die ID der Schaltfläche OK sollte auf einen anderen Wert wie IDC_OK geändert werden. Ändern Sie auch die Eigenschaften der Schaltfläche OK, damit es sich nicht um eine Standard-Drucktaste handelt. Verwenden Sie als nächstes Klassen, um ein neues Dialogfeld Mitglied funciton zu erstellen. Benennen Sie die neue Memberfunktion so wie OnClickedOK. Diese Funktion sollte an die BN_CLICKED Nachricht vom IDC_OK-Steuerelement gebunden sein. Sobald dies abgeschlossen ist, schreiben Sie den Text der OnClickedOK-Funktion. Sie sollten den Code, den Sie normalerweise in die OnOK-Funktion einfügen, in die neue OnClickedOK-Funktion einfügen, einschließlich der OnOK-Funktion einer Klasse. Fügen Sie den folgenden Prototyp zur Headerdatei für das Dialogfeld hinzu:
   protected:      virtual void OnOK();
Fügen Sie dem Dialogfeld eine Funktion OnOK hinzu, und Code wird wie folgt veranschaulicht:
   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();   }