Створення та зв’язування змінних, Урок 4
Створення та зв'язування змінних
Отже, ми ввели до складу класу, що управляє головним вікном програми, здатність реагувати на події, що повідомляють UDN_DELTAPOS, EN_CHANGE, а також на подію Windows WM_HSCROLL. Тепер настав час показати, як за допомогою Studio.Net можна створити змінні, здатні обмінюватися даними з елементами управління (дочірніми вікнами) діалогу. Технологія обміну в Visual C++ давно усталася і відбувається за таким алгоритмом:
- При відкритті вікна діалогу йому надсилається повідомлення WM_INITDIALOG, яке відгукується або клас вашого діалогу, або батьківський клас CDialog.
- У функції відгуку OnlnitDialog вашого класу ви робите необхідні початкові установки та викликаєте батьківську версію цієї функції. Причому порядок цих дій залежить від типів елементів керування та їх установок.
- Батьківська версія OnlnitDialog викликає функцію UpdateData (FALSE) для провокування обміну даними між змінними діалогового класу та елементами керування. Напрямок обміну задається параметром функції UpdateData: якщо він TRUE, то обмін відбувається у бік змінних, і якщо FALSE, то бік елементів управління. Очевидно, що до складу класу треба запровадити змінні та зв'язати їх з елементами управління.
- Після того, як користувач ввів або вводить зміни в стан елементів управління, знову, якщо це передбачив програміст, викликається функція UpdateData (TRUE) або одна з функцій типу GetDlgitem*. Вони провокують обмін даними у бік змінних.
- Функція UpdateData викликає функцію DoDataExchange, яка обов'язково є у кожному діалоговому класі. Остання складається з послідовності викликів глобальнихфункцій MFC типу DDX_ та DDV_, які вміють надійно обмінювати дані в обидві сторони та ввічливо повідомляти про можливі помилки та невідповідності при обміні.
- При закритті діалогу (тут мається на увазіне нашдіалог, який є головним вікном програми, а звичайний модальний діалог) каркас програми знову викликає UpdateData (TRUE) для того, щоб зробити зчитування даних, введених користувачем.
Необхідно пам'ятати, що простим елементам управління (static Control, Button Control або Edit Control) зазвичай ставлять у відповідність прості змінні типу int, BOOL або cstring. Більш складним елементам (Spin Control, Slider Control) зазвичай відповідають змінні, які є класами об'єктами (CSpinButtonCtrl, CSliderCtrl). Зараз ми введемо до діалогового класу змінні, які ми зв'яжемо (асоціюємо) з елементами управління. Деякі з цих змінних ми вже заочно використовували у коді функцій-обробників.
У вікні Class View знайдіть новий вузол Variables, розкрийте його і клацніть двічі мишею елемент m_Spin. У вікні LookDlg.h ви побачите, що майстер вставив декларацію:
Знайдіть тіло функції DoDataExchange і переконайтеся, що в ній з'явився рядок:
DDX_Control (pDX, IDC_SPIN, m__Spin);
яка зв'язує елемент IDC_SPIN із об'єктом m_spin. Тепер повторіть всі дії для IDC_SLIDER. У класі CLookDig має з'явитися об'єкт m_Slider класу CSliderCtrl.
У вікні діалогу залишилося ще багато елементів управління, з якими не пов'язані жодні змінні. Зараз ми створимо ці змінні, але нагадаємо, що елементи типу static Control (поле тексту) можуть бути як керованими, так і немає. В останньому випадку всі вони повинні мати один і той жеідентифікатор IDC_STATIC Ми керуватимемо шістьма елементами типу static і одним елементом (IDC_CURRENT) типу Edit Control. Всі елементи будуть пов'язані зі змінними за схемою Value, тобто між ними відбуватиметься обмін за допомогою функцій DDX_Text, а змінні матимуть тип cstring. Процедура створення та зв'язування змінних для всіх елементів типу static однакова, тому ми наведемо опис лише однієї, а ви повторите її для всіх інших.
- Відкрийте діалогове вікно, встановіть курсор у вікно IDC_TOTAL і викличте контекстне меню.
- У меню виберіть команду Variable — з'явиться майстер Add Variable Wizard.
- У вікні майстра Control ID: слід вибрати ідентифікатор IDC_TOTAL.
- Встановіть прапорець Control variable.
- Перемикач Control-Value встановіть у положення Value.
- У вікні Access: виберіть тип private.
- У вікні Variable Type: вкажіть тип змінної CString.
- У вікні Variable Name: вкажіть ім'я змінної m_Total.
- Натисніть кнопку Finish.
DDX_Text(pDX, IDCJTOTAL, mJTotal);
Виклик функції DDX_Text гарантує, що у ключові моменти життя програми буде здійснюватися обмін між змінною m_Total та полем тексту IDC_TOTAL. Ви ніколи не будете явно викликати функцію DoDataExchange. Її викликає функція UpdateData. Вона створює об'єкт допоміжного класу CDataExchange і задає напрямок обміну. Якщо параметр функції UpdateData дорівнює TRUE або відсутній, то обмін здійснюється у бік змінних, якщо він дорівнює FALSE, навпаки. Каркас програми без вашої участі і в потрібні моменти викликає UpdateData, але ви можете і самі викликати цю функцію тоді, коли необхідно зробити обмін. Зазвичай це моменти, коли вам требавважати всі дані з вікон або, навпаки, відобразити у вікнах зміни даних, зроблені програмою. Тепер повторіть кроки зі створення змінних, пов'язаних із вікнами елементів типу static Control. Усі змінні повинні мати тип cstring. Дані цієї операції наведені в табл. 4.4.
Таблиця. 4.4.Ідентифікатори елементів та пов'язані з ними змінні