Come usare il tasto invio da modifica controlli in una finestra di dialogo

Riepilogo

Le applicazioni basate su Windows spesso visualizzano le finestre di dialogo immissione dati per richiedere informazioni agli utenti. Queste finestre di dialogo possono contenere diversi controlli di modifica e due pulsanti di comando (push), contrassegnati con OK e CANCEL. Un esempio di finestra di dialogo immissione dati è quello che richiede informazioni personali, ad esempio il numero di previdenza sociale, l'indirizzo, il numero di identificazione (ID), la data/ora e così via, dagli utenti. Ognuno di questi elementi viene immesso in un controllo di modifica. Per impostazione predefinita, il tasto TAB viene usato in una finestra di dialogo per spostare lo stato di attivazione tra i controlli di modifica. Come interfaccia utente comune, tuttavia, si può anche usare il tasto invio (ritorno) per spostarsi tra i controlli di modifica, ad esempio dopo che l'utente ha inserito una informazione, premendo invio si sposta lo stato di attivazione sul campo successivo. Esistono alcuni modi per abilitare l'uso del tasto INVIO per passare tra i controlli di modifica. Un metodo consiste nell'usare WM_COMMAND e i messaggi di notifica forniti nella finestra di dialogo per i pulsanti e i controlli di modifica. Un altro metodo consiste nel sottoclassare i controlli di modifica. Una terza prevede l'uso della procedura guidata App Studio e della classe e la creazione di una nuova funzione membro della finestra di dialogo.

Ulteriori informazioni

Metodo I: (WM_COMMAND)

Questo metodo si basa sul comportamento seguente delle finestre di dialogo (gestione finestre di dialogo) e sulla gestione dello stato attivo in Windows. se una finestra di dialogo o uno dei relativi controlli ha attualmente lo stato attivo per l'input, quindi premere INVIO fa in modo che Windows invii un messaggio di WM_COMMAND con il parametro idItem (wParam) impostato sull'ID del pulsante di comando predefinito. Se nella finestra di dialogo non è presente un pulsante di comando predefinito, il parametro idItem è impostato su IDOK per impostazione predefinita. Quando un'applicazione riceve il messaggio di WM_COMMAND con idItem impostato sull'ID del pulsante di comando predefinito, lo stato attivo rimane con il controllo che ha lo stato attivo prima della pressione del tasto INVIO. Chiamando Getaf () a questo punto restituisce l'handle del controllo che ha lo stato attivo prima che il tasto invio sia stato premuto. L'applicazione può controllare il punto di manipolazione del controllo e determinare se appartiene a uno dei controlli di modifica nella finestra di dialogo. In caso affermativo, l'utente stava immettendo dati in uno dei controlli di modifica e, dopo averlo fatto, preme INVIO. A questo punto, l'applicazione può inviare il messaggio di WM_NEXTDLGCTL alla finestra di dialogo per spostare lo stato di attivazione sul controllo successivo. Tuttavia, se lo stato principale è uno dei pulsanti di comando (Annulla o OK), quindi GetState () restituisce un handle di controllo Button, a questo punto si può chiudere la finestra di dialogo. Il codice pseudo per questa logica è simile al seguente nella procedura della finestra di dialogo dell'applicazione:

     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 ;

Metodo II

Questo metodo prevede la sottoclasse/superclasse del controllo di modifica nella finestra di dialogo. Una volta che i controlli di modifica sono sottoclassati o sovraclassati, tutti gli input da tastiera vengono inviati alla procedura sottoclasse/superclasse del controllo di modifica che attualmente ha lo stato attivo per l'input, indipendentemente dal fatto che la finestra di dialogo disponga o meno di un pulsante di comando predefinito. L'applicazione può intercettare i messaggi di chiave (o char), cercare il tasto invio e eseguire di conseguenza l'elaborazione. La procedura seguente è una sottoclasse di esempio che cerca il tasto invio:

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

Metodo 3

Questo metodo prevede l'uso di App Studio e ClassWizard e la creazione di una nuova funzione membro della finestra di dialogo. Questo metodo consentirà a un utente di premere il tasto invio e lo stato di avanzamento del controllo di modifica successivo. Se lo stato attivo si trova attualmente nell'ultimo controllo di modifica nella finestra di dialogo, lo stato attivo avanzerà sul primo controllo di modifica. Prima di tutto, USA App Studio per modificare l'ID del pulsante OK della finestra di dialogo. Il comportamento predefinito di App Studio consiste nel dare al pulsante OK l'ID IDOK. L'ID del pulsante OK deve essere modificato in un altro valore, ad esempio IDC_OK. Modificare inoltre le proprietà del pulsante OK in modo che non sia un pulsante predefinito. Quindi, USA ClassWizard per creare un nuovo membro della finestra di dialogo funciton. Assegnare un nome alla nuova funzione membro come OnClickedOK. Questa funzione deve essere collegata al messaggio BN_CLICKED dal controllo IDC_OK. Al termine, scrivi il corpo della funzione OnClickedOK. Dovresti inserire il codice che in genere inseriresti nella funzione OnOK nella nuova funzione OnClickedOK, inclusa la funzione OnOK di una classe. Aggiungere il prototipo seguente al file di intestazione per la finestra di dialogo:

   protected:      virtual void OnOK();

Aggiungere una funzione OnOK alla finestra di dialogo e il codice è come illustrato di seguito:

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

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×