Kaip naudoti klavišą "įveskite" dialogo lange Redaguoti valdiklius


Suvestinė


"Windows" pagrįstos taikomosios programos dažnai rodo duomenų įvedimo dialogo langus, kad būtų galima prašyti informacijos iš vartotojų. Šiuose dialogo languose gali būti keli redagavimo valdikliai ir du komandų (Push) mygtukai, pažymėti gerai ir atšaukti. Duomenų įvedimo dialogo lango pavyzdys yra tas, kuris prašo asmeninės informacijos, pvz., socialinio draudimo numerio, adreso, identifikavimo (ID) numerio, datos/laiko ir pan. Visi šie elementai įvedami į redagavimo valdiklį. Pagal numatytuosius, tabuliavimo klavišas naudojamas dialogo lange, kad būtų galima perkelti įvesties vietą tarp redagavimo valdiklių. Tačiau, kaip įprasta vartotojo sąsaja, taip pat galima naudoti įvedimo (grįžimo) klavišą, kad pereitumėte nuo redagavimo valdiklių (pvz., kai vartotojas įveda informacijos dalį, paspaudus klavišą "" įveskite "perkelia įvesties vietą į kitą lauką). Yra keli būdai, kaip galima naudoti klavišą "įveskite", kad pereitumėte nuo redagavimo valdiklių. Vienas būdas – naudoti WM_COMMAND ir pranešimus, kurie turi būti pateikti dialogo lange, kuriame galima redaguoti valdiklius ir mygtukus. Kitas būdas apima redagavimo valdiklių perklasiką. Trečiasis apima naudojant taikomųjų programų studiją ir klasės vediklį bei kuriant naują dialogo lango nario funkciją.

Daugiau informacijos


I metodas: (WM_COMMAND)

Šis metodas pagrįstas toliau nurodytais dialogo langų veiksmais (dialogų tvarkytuvas) ir fokusavimo tvarkymu sistemoje "Windows". Jei dialogo lange arba viename iš jo valdiklių yra įvesties įvesties vieta, tada paspaudus klavišą "įvesti" "Windows" siunčiamas WM_COMMAND pranešimas, kuriame nustatytas "idItem" (wParam) parametras, nustatytas kaip numatytosios komandos mygtuko ID. Jei dialogo lange nėra numatytojo komandos mygtuko, numatytoji reikšmė yra nustatyta kaip IDOK. Kai taikomoji programa gauna WM_COMMAND pranešimą su idioma, nustatyta kaip numatytojo komandos mygtuko ID, įvesties vieta išlieka su valdikliu, kuris buvo suaktyvintas prieš paspaudus klavišą "įvedimo". Skambinimas GetFocus () Šiuo metu pateikia valdiklio, kuris buvo suaktyvintas prieš paspaudus įvedimo klavišą, rankenėlę. Taikomoji programa gali patikrinti šią valdymo rankenėlę ir nustatyti, ar ji priklauso bet kuriam dialogo lango redagavimo valdikliui. Jei taip, vartotojas įveda duomenis į vieną iš redagavimo valdiklių ir atlikę šiuos veiksmus paspaudę įvesti. Šiuo metu taikomoji programa gali nusiųsti WM_NEXTDLGCTL pranešimą į dialogo langą, kad perkeltumėte įvesties vietą į paskesnį valdiklį. Tačiau jei įvesties vieta buvo su vienu iš komandų mygtukų (atšaukti arba gerai), tada GetFocus () pateikia mygtuko valdymo rankenėlę, kurioje taškas gali atmesti dialogo langą. Šios logikos pseudo kodas programos dialogo lango procedūroje yra panašus į šį:
     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 metodas

Šis metodas apima dialogo lango redagavimo valdiklio perklasiimą/perklasiką. Kai redagavimo valdikliai perklasifikuojami arba perklasifikuojami, visi spartieji klavišai siunčiami redagavimo valdiklio, kuris šiuo metu turi įvesties vietą, porklasei/superclass procedūrai, neatsižvelgiant į tai, ar dialogo langas turi numatytąjį komandos mygtuką. Programa gali gaudyklė rakto žemyn (arba char) pranešimais, ieškoti įvedimo klavišo ir atlikti apdorojimą. Toliau pateikiamas pavyzdinės klasės procedūra, kuri ieško įvedimo klavišo:
   //*-------------------------------------------------------------------   //| 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 metodas

Šiame metode naudojama taikomųjų programų studija ir ClassWizard ir naujo dialogo lango nario funkcijos kūrimas. Šis metodas leis vartotojui paspausti klavišą "klavišą" ir įvesties vieta bus pereita į paskesnį redagavimo valdiklį. Jei dialogo lange Paskutinis redagavimo valdiklis suaktyvinamas, suaktyvinamas pirmasis redagavimo valdiklis. Pirmiausia naudokite taikomųjų programų studiją, kad pakeistumėte dialogo lango gerai mygtuko ID. Numatytasis taikomųjų programų studijos veikimo būdas – suteikti gerai mygtuką ID IDOK. Mygtuko gerai ID turi būti pakeistas kita reikšme, pvz., IDC_OK. Be to, pakeiskite mygtuką Gerai, kad jis nebūtų numatytasis smeigtuką. Tada naudokite ClassWizard, kad sukurtumėte naują dialogo lango narį funciton. Pavadinkite naująją nario funkciją panašiai kaip OnClickedOK. Ši funkcija turi būti susieta su BN_CLICKED pranešimu iš IDC_OK valdiklio. Kai tai padarysite, parašykite funkcijos OnClickedOK tekstą. Turėtumėte įdėti kodą, kurį paprastai būtų galima įtraukti į funkciją OnOK, į naują OnClickedOK funkciją, įskaitant klasės funkciją OnOK. Įtraukite šį prototipą į dialogo lango antraštės failą:
   protected:      virtual void OnOK();
Įtraukti funkciją OnOK į dialogo langą ir kodas yra toks, kaip parodyta toliau:
   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();   }