De toets ENTER van de besturingselementen bewerken in een dialoogvenster gebruiken


Samenvatting


Op Windows gebaseerde toepassingen worden vaak dialoogvensters voor gegevensinvoer weergegeven om informatie van gebruikers aan te vragen. Deze dialoogvensters bevatten mogelijk diverse besturingselementen voor bewerken en twee opdrachten (push), met het label OK en annuleren. Een voorbeeld van het dialoogvenster gegevensinvoer is een voorbeeld van het dialoogvenster voor het openen van persoonlijke gegevens, zoals het sofi-nummer, het adres, het identificatienummer, de datum en de tijd, enzovoort, van gebruikers. Elk van deze items wordt ingevoerd in een besturingselement voor bewerken. Standaard wordt de TAB-toets in een dialoogvenster gebruikt om de focus te verplaatsen tussen besturingselementen bewerken. Een gemeenschappelijke User-Interface kan echter ook gebruikmaken van de toets ENTER (RETURN) om te schakelen tussen de bewerkings besturingselementen (wanneer de gebruiker een deel van de gegevens heeft ingevoerd) de focus verplaatsen naar het volgende veld in het veld ENTER. U kunt op een aantal manieren opgeven dat u de ENTER-toets wilt gebruiken om te schakelen tussen besturingselementen bewerken. Eén methode is om gebruik te maken van WM_COMMAND en de meldingen die u ontvangt in het dialoogvenster voor het bewerken van besturingselementen en knoppen. Een andere methode maakt het subklassete van de besturingselementen voor bewerken. U dient een derde functie te gebruiken voor het maken van een lid, en het maken van een nieuw dialoogvenster.

Meer informatie


Methode I: (WM_COMMAND)

Deze methode is gebaseerd op het volgende gedrag van dialoogvensters (dialog Manager) en focus verwerking in Windows. als een dialoogvenster of een van de besturingselementen momenteel de invoerfocus heeft en u op de ENTER-toets drukt, verzendt Windows een WM_COMMAND bericht waarbij de parameter idItem (wParam) is ingesteld op de ID van de standaardopdracht knop. Als het dialoogvenster geen standaardopdracht knop heeft, wordt de parameter idItem standaard ingesteld op IDOK. Wanneer een toepassing het WM_COMMAND-bericht ontvangt waarbij idItem is ingesteld op de ID van de standaardopdracht knop, blijft de focus met het besturingselement dat de focus had voordat de toets ENTER werd ingedrukt. Wanneer u GetFocus () aanroept, wordt de handle van het besturingselement geretourneerd die de focus hadden voordat de toets ENTER werd ingedrukt. De toepassing kan deze besturingsgreep controleren en nagaan of deze deel uitmaakt van de bewerkings besturingselementen in het dialoogvenster. Als dit het geval is, dan is de gebruiker in een van de besturingselementen voor bewerken van gegevens ingevoerd en op ENTER gedrukt. Op dit moment kan de toepassing het WM_NEXTDLGCTL bericht naar het dialoogvenster verzenden, zodat de focus naar het volgende besturingselement wordt verplaatst. Als de focus echter met een van de opdrachtknoppen (annuleren of OK) is, retourneert GetFocus () de besturingsgreep van een knop, waarnaar wordt verwezen in het dialoogvenster. De pseudo-code voor deze logica is vergelijkbaar met de volgende in de dialoogvenster procedure van de toepassing:
     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

Deze methode heeft betrekking op het bewerken van een besturingselement in het dialoogvenster voor het bewerken van een groep. Wanneer de besturingselementen voor bewerken zijn onderklasseeerd of superklassen, wordt alle toetsenbordinvoer verzonden naar de subklasse/superklasse-procedure van het bewerkingsbesturingselement dat momenteel invoerfocus heeft, ongeacht of het dialoogvenster een standaardopdracht knop heeft. De toepassing kan de door u geplaatste berichten of tekens opvangen, zoeken naar de ENTER-toets en de verwerking dienovereenkomstig uitvoeren. Hieronder ziet u een voorbeeld van een subcategorie die u zoekt naar de ENTER-toets:
   //*-------------------------------------------------------------------   //| 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

Voor deze methode moet u apps Studio en ClassWizard gebruiken en een nieuwe lid-functie voor het dialoogvenster maken. Met deze methode kunt u een gebruiker in staat stellen om de ENTER-toets ingedrukt te houden en de focus te verplaatsen naar het volgende besturingselement voor bewerken. Als u momenteel de focus op het laatste besturingselement voor bewerken in het dialoogvenster ziet, gaat de focus naar het eerste besturingselement voor bewerken. Gebruik eerst app Studio om de ID van de knop OK in het dialoogvenster te wijzigen. Het standaardgedrag van App Studio is door de knop OK de ID IDOK te geven. De ID van de knop OK moet worden gewijzigd in een andere waarde, zoals IDC_OK. Wijzig ook de eigenschappen van de knop OK, zodat deze geen standaard Pushbutton is. Gebruik vervolgens ClassWizard om een nieuw lid te maken van een funciton. Geef een naam op voor de nieuwe lid functie, zoals OnClickedOK. Deze functie moet zijn gekoppeld aan de BN_CLICKED berichten van het IDC_OK besturingselement. Wanneer u klaar bent, schrijft u de tekst van de functie OnClickedOK. U moet de code die u normaalgesproken in de functie OnOK, in de nieuwe OnClickedOK-functie plaatst, waaronder de functie OnOK van een klas. Het volgende prototype toevoegen aan het koptekst bestand voor het dialoogvenster:
   protected:      virtual void OnOK();
U kunt een OnOK-functie toevoegen aan het dialoogvenster en de code is als volgt:
   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();   }