Sammanfattning
Windows-baserade program visar ofta data inmatnings dialog rutor för att begära information från användarna. Dessa dialog rutor kan innehålla flera redigerings kontroller och två kommando knappar, med etiketten OK och Avbryt. Ett exempel på en dialog ruta för data inmatning är ett namn som efterfrågar person uppgifter, till exempel person nummer, adress, identifikation (ID), datum/tid och så vidare från användare. Varje objekt anges i en redigerings kontroll. Som standard används TABB-tangenten i en dialog ruta för att flytta fokus mellan redigerings kontroller. Som ett gemensamt användar gränssnitt kan en av dem också använda retur (retur)-tangenten för att flytta mellan redigerings kontrollerna (när användaren till exempel skriver in en del av informationen flyttas fokus till nästa fält). Det finns några sätt att aktivera användning av ENTER-tangenten för att flytta mellan redigerings kontroller. En metod är att använda WM_COMMAND och aviserings meddelanden som ingår i dialog rutan för redigerings kontroller och-knappar. En annan metod är att underklasser kontrollen redigera. En tredje inbegriper användning av guiden App Studio och klass och skapa en ny dialog Rute medlems funktion.
Mer information
Metod I: (WM_COMMAND)
Den här metoden är baserad på följande sätt i dialog rutor (dialog hanteraren) och fokus hantering i Windows. om en dialog ruta eller en av dess kontroller för närvarande har fokus kan du trycka på RETUR-tangenten för att skicka ett WM_COMMAND meddelande med parametern idItem (wParam) inställd till ID: t för standard kommando knappen. Om dialog rutan inte har en standard kommando knapp är parametern idItem inställd på IDOK som standard. När ett program tar emot WM_COMMAND-meddelandet med idItem inställt på standard kommando knappens namn behålls fokus med den kontroll som hade fokus innan RETUR-tangenten trycks ned. När du anropar GetFocus () i den här punkten returneras handtaget på kontrollen som hade fokus innan RETUR-tangenten trycks ned. Programmet kan kontrol lera detta kontroll handtag och avgöra om det tillhör någon av redigerings kontrollerna i dialog rutan. Om det gör det har användaren angett data i en redigerings kontroll och därefter trycker du på RETUR. I det här läget kan programmet skicka WM_NEXTDLGCTL meddelande till dialog rutan för att flytta fokus till nästa kontroll. Men om fokus var med en av kommando knapparna (Avbryt eller OK) returnerar GetFocus () ett knapp kontroll handtag där en åtgärd kan stänga dialog rutan. Pseudo-koden för denna logik ser ut som i programmets dialog Rute procedur:
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 ;
Metod II
Den här metoden innebär att redigerings kontrollen underklassas/uppklassas i dialog rutan. När redigerings kontrollerna är underklassade eller superklassade skickas alla tangent bords inmatningar under klass/superklass-procedur för den Edit-kontroll som för närvarande har fokus, oavsett om dialog rutan har en standard kommando knapp. Programmet kan svälla tangent ned-eller char-meddelanden, leta efter RETUR-tangenten och bearbeta det sedan. Här följer ett exempel på en underklass för att ange ett värde:
//*------------------------------------------------------------------- //| 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 */
Metod 3
Den här metoden förutsätter att du använder appen Studio och ClassWizard och skapar en ny dialog Rute medlems funktion. Med den här metoden kan en användare trycka på RETUR och få fokus till nästa Edit-kontroll. Om fokus för tillfället är på den senaste Edit-kontrollen i dialog rutan flyttas fokus till den första Edit-kontrollen. Börja med att använda App Studio för att ändra ID för knappen OK i dialog rutan. Standard beteendet för App Studio är att ge knappen OK IDOK. Knapp-ID för OK ska ändras till ett annat värde, till exempel IDC_OK. Ändra också egenskaperna för knappen OK så att den inte är en standard tryck knapp. Använd sedan ClassWizard för att skapa en ny dialog rutas funciton. Namnge den nya medlemmen, till exempel OnClickedOK. Den här funktionen bör vara knuten till BN_CLICKED meddelande från IDC_OK kontroll. När det är klart, skriv bröd texten för funktionen OnClickedOK. Du bör placera koden som du normalt satt i funktionen OnOK i den nya OnClickedOK-funktionen, inklusive en Klasss OnOK-funktion. Lägg till följande prototyp i rubrik filen för dialog rutan:
protected: virtual void OnOK();
Lägg till en OnOK-funktion i dialog rutan och koden är enligt nedan:
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(); }