Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Σύνοψη

Οι εφαρμογές που βασίζονται στα Windows εμφανίζουν συχνά παράθυρα διαλόγου καταχώρησης δεδομένων για να ζητούν πληροφορίες από τους χρήστες. Αυτά τα παράθυρα διαλόγου μπορεί να περιέχουν διάφορα στοιχεία ελέγχου επεξεργασίας και δύο κουμπιά εντολής (push), με ετικέτα OK και ΆΚΥΡο. Ένα παράδειγμα ενός παραθύρου διαλόγου καταχώρησης δεδομένων είναι αυτό που ζητά προσωπικές πληροφορίες, όπως τον αριθμό κοινωνικής ασφάλισης, τη διεύθυνση, τον αριθμό αναγνώρισης (ID), την ημερομηνία/ώρα και ούτω καθεξής, από τους χρήστες. Κάθε ένα από αυτά τα στοιχεία καταχωρείται σε ένα στοιχείο ελέγχου επεξεργασίας. Από προεπιλογή, το πλήκτρο TAB χρησιμοποιείται σε ένα παράθυρο διαλόγου για τη μετατόπιση της εστίασης μεταξύ των στοιχείων ελέγχου επεξεργασίας. Ως κοινό περιβάλλον εργασίας χρήστη, ωστόσο, μπορεί να χρησιμοποιηθεί επίσης το πλήκτρο ENTER (RETURN) για να μετακινηθείτε μεταξύ των στοιχείων ελέγχου επεξεργασίας (για παράδειγμα, αφού ο χρήστης εισαγάγει μια πληροφορία, πατώντας το πλήκτρο ENTER μετακινεί την εστίαση στο επόμενο πεδίο). Υπάρχουν μερικοί τρόποι για να ενεργοποιήσετε τη χρήση του πλήκτρου ENTER για να μετακινηθείτε μεταξύ των στοιχείων ελέγχου επεξεργασίας. Μία μέθοδος είναι να χρησιμοποιήσετε WM_COMMAND και τα μηνύματα ειδοποίησης που συνοδεύουν το παράθυρο διαλόγου για την επεξεργασία στοιχείων ελέγχου και κουμπιών. Μια άλλη μέθοδος περιλαμβάνει την υποκατηγορία των στοιχείων ελέγχου επεξεργασίας. Ένα τρίτο περιλαμβάνει τη χρήση του οδηγού εφαρμογών Studio και Class και τη δημιουργία μιας νέας συνάρτησης Member του παραθύρου διαλόγου.

Περισσότερες πληροφορίες

Μέθοδος I: (WM_COMMAND)

Αυτή η μέθοδος βασίζεται στην ακόλουθη συμπεριφορά των παραθύρων διαλόγου (διαχείριση παραθύρων) και του χειρισμού εστίασης στα Windows. Εάν ένα παράθυρο διαλόγου ή ένα από τα στοιχεία ελέγχου του έχει αυτήν τη στιγμή την εστίαση εισόδου και, στη συνέχεια, το πάτημα του πλήκτρου ENTER προκαλεί στα Windows την αποστολή ενός 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 ;

Μέθοδος II

Αυτή η μέθοδος περιλαμβάνει την υποκλάση/την υπερ-κλάση του στοιχείου ελέγχου επεξεργασίας στο παράθυρο διαλόγου. Όταν τα στοιχεία ελέγχου επεξεργασίας είναι υποκατηγορίες ή έχουν υπερκλάση, όλα τα στοιχεία εισόδου του πληκτρολογίου αποστέλλονται στη διαδικασία υποκατηγορίας/υπερ-κλάσης του στοιχείου ελέγχου επεξεργασίας που έχει τη συγκεκριμένη στιγμή εστίαση, ανεξάρτητα από το εάν το παράθυρο διαλόγου έχει ένα προεπιλεγμένο κουμπί εντολής. Η εφαρμογή μπορεί να παγιδεύσει τα μηνύματα του πλήκτρου Down (ή char), να αναζητήσει το πλήκτρο 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

Αυτή η μέθοδος περιλαμβάνει τη χρήση του App Studio και του ClassWizard και τη δημιουργία μιας νέας συνάρτησης Member του παραθύρου διαλόγου. Αυτή η μέθοδος θα επιτρέψει σε έναν χρήστη να πιέσει το πλήκτρο ENTER και να έχει την εστίαση εκ των προτέρων στο επόμενο στοιχείο ελέγχου επεξεργασίας. Εάν η εστίαση είναι αυτήν τη στιγμή στο τελευταίο στοιχείο ελέγχου επεξεργασίας στο παράθυρο διαλόγου, η εστίαση θα προχωρήσει στο πρώτο στοιχείο ελέγχου επεξεργασίας. Πρώτα, χρησιμοποιήστε το App Studio για να αλλάξετε το αναγνωριστικό του κουμπιού OK του παραθύρου διαλόγου. Η προεπιλεγμένη συμπεριφορά του App Studio είναι να δίνει το κουμπί OK το αναγνωριστικό IDOK. Το αναγνωριστικό του κουμπιού OK θα πρέπει να αλλάξει σε άλλη τιμή, όπως IDC_OK. Επίσης, αλλάξτε τις ιδιότητες του κουμπιού OK, ώστε να μην είναι προεπιλεγμένο μπουτόν. Στη συνέχεια, χρησιμοποιήστε το ClassWizard για να δημιουργήσετε ένα νέο παράθυρο διαλόγου μέλος Funciton. Ονομάστε τη συνάρτηση New Member κάτι σαν 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. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×