Загальні відомості
На основі Windows програми часто відображаються діалогові вікна введення даних, щоб запитувати інформацію від користувачів. Ці діалогові вікна можуть містити кілька елементів керування "Редагувати", а також дві кнопки (Push), позначені як "OK" і "Скасувати". Приклад діалогового вікна введення даних – це один із запитів особистих відомостей, наприклад номера соціального страхування, адреси, ідентифікації (ІДЕНТИФІКАТОРА), дати й часу тощо, від користувачів. Кожне з цих елементів вводиться в елемент керування "Редагування". За замовчуванням клавіша TAB використовується в діалоговому вікні, щоб змінити фокус між елементами керування. Проте можна також використовувати клавішу ENTER (RETURN), щоб переміщатися між елементами керування (наприклад, після того, як користувач вводить фрагмент інформації, натискаючи клавішу ENTER переміщує фокус до наступного поля). Щоб перейти до переходу між елементами керування, можна ввімкнути кілька способів використання клавіші ВВОДУ. Один із способів полягає в тому, щоб використовувати WM_COMMAND та сповіщення, які постачаються з ним у діалоговому вікні для редагування елементів керування та кнопок. Ще один метод включає в себе відповідні елементи керування "Редагування". Третина включає в себе використання веб-студії та майстра класів і створення нової функції учасника діалогового вікна.
Додаткові відомості
Метод I: (WM_COMMAND)
Цей метод ґрунтується на такій поведінці діалогових вікон (диспетчер діалогових вікон) і фокус фокуса в ОС Windows. Якщо діалогове вікно або один із його елементів керування, який наразі має фокус, натисніть клавішу вводу, щоб створити повідомлення WM_COMMAND з параметром idItem (wParam) для ІДЕНТИФІКАТОРА кнопки за замовчуванням. Якщо в діалоговому вікні немає кнопки за замовчуванням, то параметр idItem має значення IDOK за замовчуванням. Коли програма отримує повідомлення WM_COMMAND з ідентифікатором "idItem" для ідентифікатора кнопки за замовчуванням, фокус залишається з елементом керування, який мав фокус до натискання клавіші ВВОДУ. Виклик GetFocus () на цьому етапі повертає дескриптор елемента керування, який мав фокус до натискання клавіші ВВОДУ. Програма може перевірити цей маркер керування та визначити, чи вона належить до будь-якого елемента керування "Редагувати" в діалоговому вікні. Якщо це так, користувач увев дані в один із елементів керування, а потім натисніть клавішу ВВІД. На цьому етапі програма може відправити 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
Цей метод включає в себе відповідні можливості, а також налаштувати елемент керування "Редагування" в діалоговому вікні. Після того, як елементи керування "Редагувати" підкласифічуватись або надкласифіковані, усі вхідні на клавіатурі надсилатиметься як процедура "Редагування", яка зараз має вхідний фокус, незалежно від того, чи є діалогове вікно за замовчуванням. Програма може трепінгувати ключові повідомлення (або char), шукати клавішу ВВОДУ, а також виконувати обробку відповідним чином. Нижче наведено зразок процедури підкласу, яка шукає ключ ВВОДУ.
//*------------------------------------------------------------------- //| 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.
Цей метод включає в себе використання програм-студіо та ClassWizard і створення нової функції учасника діалогового вікна. Цей метод дасть змогу користувачу натискати клавішу ВВОДУ та перейти до фокуса до наступного елемента керування "Редагування". Якщо фокус зараз перебуває в останньому елементі керування "Редагування" в діалоговому вікні, фокус буде перейти до першого елемента керування "Редагування". Спочатку скористайтеся програмою Studio, щоб змінити ІДЕНТИФІКАТОР кнопки OK діалогового вікна. Поведінка за замовчуванням у програмі Studio дає змогу натиснути кнопку OK ID IDOK. ІДЕНТИФІКАТОР кнопки OK має бути змінене для іншого значення, наприклад IDC_OK. Крім того, змініть властивості кнопки OK, щоб вона не була типовою кнопкою. Далі використовуйте майстер ClassWizard, щоб створити новий елемент діалогового вікна. Назвіть новий учасник функції, як-от Onclonekdok. Цю функцію слід прив'язати до BN_CLICKED повідомлення з елемента керування IDC_OK. Після цього, напишіть в тілі функції Onclakkedok. Ви повинні помістити код, який зазвичай можна помістити в функцію OnOK, у нову функцію Onclakkedok, включно з функцією 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(); }