Použití klávesy ENTER v dialogovém okně Upravit

Shrnutí

Aplikace určené pro systém Windows často zobrazují dialogová okna pro zadávání dat, aby si mohli vyžádat informace od uživatelů. Tato dialogová okna můžou obsahovat několik ovládacích prvků pro úpravy a dvě tlačítka příkazu (tlačítko), označená OK a Storno. Příklad dialogového okna pro zadávání dat je ten, který vyžádá osobní údaje, jako je rodné číslo, adresa, identifikační číslo (ID), datum/čas atd. Všechny tyto položky jsou zadané do ovládacího prvku pro úpravy. Ve výchozím nastavení se pomocí klávesy TAB přesměruje fokus mezi ovládacími prvky pro úpravy. Stejně jako běžné uživatelské rozhraní však může dojít k přecházení mezi ovládacími prvky úprav pomocí klávesy ENTER (RETURN) (třeba když uživatel zadá informaci, stisknutí klávesy ENTER přesune fokus na další pole). Existuje několik způsobů, jak povolit pohyb mezi ovládacími prvky pro úpravy pomocí klávesy ENTER. Jedním z metod je používat WM_COMMAND a zprávy s oznámením, které jsou v dialogovém okně pro úpravy ovládacích prvků a tlačítek. Další metoda zahrnuje podtřídování ovládacích prvků pro úpravy. Třetí zahrnuje použití aplikace App Studio a Průvodce tříd a vytvoření nové členské funkce dialogového rámečku.

Další informace

Metoda I: (WM_COMMAND)

Tento způsob je založený na následujícím chování dialogových oken (správce dialogů) a zpracování fokusu v systému Windows. Pokud se v dialogovém okně nebo některém z ovládacích prvků nachází fokus vstupu, stisknutí klávesy ENTER způsobí, že systém Windows odešle zprávu WM_COMMAND s parametrem idItem (wParam) nastaveným na hodnotu ID výchozího příkazového tlačítka. Pokud se v dialogovém okně nezobrazuje výchozí příkazové tlačítko, je idItem ve výchozím nastavení nastaven na IDOK. Když aplikace obdrží zprávu WM_COMMAND s nastavením idItem na ID výchozího příkazového tlačítka, zůstane fokus u ovládacího prvku, který měl fokus před stisknutím klávesy ENTER. Voláním funkce getfokus () v tomto okamžiku vrátíte popisovač ovládacího prvku, který měl fokus před stisknutím klávesy ENTER. Aplikace může tento ovládací úchyt zkontrolovat a určit, zda patří do libovolného z ovládacích prvků v dialogovém okně. Pokud ano, uživatel zadal data do některého z ovládacích prvků pro úpravy a po tomto postupu stiskněte ENTER. V tomto okamžiku může aplikace odeslat WM_NEXTDLGCTL zprávu do dialogového okna a přesunout fokus na další ovládací prvek. Pokud se ale fokus jednal s jedním z příkazových tlačítek (CANCEL nebo OK), vrátí funkce getfokus () ovládací úchyt tlačítka, ve kterém se může dialogové okno zavřít. Pseudo kód pro tuto logiku se v proceduře dialogového okna aplikace podobá následujícímu příkladu:

     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 ;

Metoda II

Tato metoda zahrnuje funkci pro nastavení podtříd/nadřazení v dialogovém okně. Jakmile jsou ovládací prvky pro úpravy podtřídí nebo jsou v podtřídách, odešle se veškeré vstupy z klávesnice v ovládacím prvku pro úpravy, který je aktuálně vstupním fokusem,, bez ohledu na to, jestli je v dialogovém okně výchozí příkazové tlačítko. Aplikace může zachytit zprávy o stisknutí klávesy dolů (nebo znaku), vyhledat klíč ENTER a odpovídajícím způsobem zpracovat. Následuje příklad procedury podtřídy, která hledá klíč 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 */ 

Metoda 3

Tato metoda zahrnuje používání App Appu a ClassWizard a vytvoření nové členské funkce dialogového rámečku. Tento způsob umožní uživateli stisknout klávesu ENTER a mít fokus na další ovládací prvek pro úpravy. Pokud je fokus aktuálně na ovládacím prvku poslední úpravy v dialogovém okně, fokus přejde na první ovládací prvek pro úpravy. Nejdřív použijte App Studio ke změně ID tlačítka OK v dialogovém okně. Výchozím chováním aplikace App Studio je poskytnout tlačítku OK ID IDOK. ID tlačítka OK by mělo být změněno na jinou hodnotu, například IDC_OK. Změňte také vlastnosti tlačítka OK tak, aby neobsahoval výchozí pushbutton. Potom pomocí ClassWizard vytvořte nové dialogové okno člena funciton. Pojmenujte novou členskou funkci něco jako OnClickedOK. Tato funkce by měla být spojena s BN_CLICKED zprávou z ovládacího prvku IDC_OK. Jakmile to uděláte, napište text funkce OnClickedOK. Kód, který byste normálně umístili do funkce OnOK, byste měli vkládat do nové funkce OnClickedOK, včetně funkce OnOK. Přidejte následující prototyp do souboru hlaviček pro dialogové okno:

   protected:      virtual void OnOK();

Přidejte do dialogového okna OnOK funkci a kód je znázorněn níže:

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

Potřebujete další pomoc?

Rozšiřte své znalosti a dovednosti
Projít školení
Získejte nové funkce jako první
Připojit se k programu Microsoft Insider

Byly tyto informace užitečné?

Děkujeme za váš názor!

Děkujeme vám za váš názor! Pravděpodobně bude užitečné, když vás spojíme s některým z našich agentů podpory Office.

×