Ноу Інти, лекція, бібліотека класів mfc

Елементи управління і діалоги

Діалоги. Знайомство з елементами управління

Діалог (діалогове вікно) являє собою спеціальний вид вікон, які призначені для взаємодії з користувачем. Зазвичай вони використовуються для зміни налаштувань програми та введення інформації. Наприклад, практично всі вікна налаштувань програми Microsoft Word є діалогами. Є два типи діалогів: модальні і немодальні. Найбільш поширені перші. У разі модальних діалогів, при активізації діалогу основне вікно програми стає пасивним і перестає реагувати на дії користувача до тих пір, поки він не закриє діалог. У разі немодального діалогів, діалог існує незалежно від інших вікон, і основне вікно також може бути активізовано.

Взаємодія між діалогом і користувачем

Взаємодія між діалогом і користувачем здійснюється за допомогою елементів управління. Це особливий тип вікон для введення або виведення. Елемент управління належить вікну-власнику, в даному випадку - діалогу. Всі версії Windows підтримують деякий набір стандартних елементів управління, до яких відносяться кнопки, контрольні перемикачі, селекторні кнопки, списки, поля введення, комбіновані списки, смуги прокрутки і статичні елементи.

Розглянемо коротко кожен з них:

  • Звичайна кнопка (push button) - це кнопка, яку користувач "натискає" мишею або клавішею Enter, перемістивши попередньо на неї фокус введення.
  • Контрольний перемикач (check box, прапорець) може бути або обраним, або ні. Якщо в діалозі є кілька контрольних перемикачів, то можуть бути обрані одночасно кілька з них.
  • Селекторна кнопка (radio button) - це, майже те саме, що і контрольний перемикач. Відмінність полягає в тому, що при наявності декількох кнопок в групі може бути обрана тільки одна.
  • Список (list box) містить набір рядків, з якого можна вибрати одну або кілька. Широко використовується при відображенні імен файлів.
  • Поле введення (edit box) - це елемент, що дозволяє ввести рядок тексту.
  • Комбінований список (combo box) являє собою список з рядком введення.
  • Статичний елемент (static control) призначений для виведення тексту або графіки, але не для введення.

Елементи управління здатні як генерувати повідомлення у відповідь на дії користувача, так і отримувати їх від додатка. В останньому випадку повідомлення є, фактично, командами, на які елемент управління повинен відреагувати.

Класи MFC для елементів управління

У MFC містяться класи для всіх стандартних елементів управління. Ці класи описують самі елементи, а також містять функції для роботи з ними. Їх називають класами управління. Вони породжуються від класу CWnd. Таким чином, всі вони мають характеристики вікна. Нижче наведені основні класи управління:

У MFC допускається безпосереднє звернення до елементів управління, але на практиці це відбувається дуже рідко. Зручніше користуватися відповідними класами. Найбільш часто кнопки дають змогу з діалоговими вікнами, хоча можна створювати і окремі елементи, розташовані в головному вікні.

Діалоги як ресурси

У MFC все діалоги є екземплярами або класу CDialog. або породжених від нього класів. Лише найпростіші діалоги використовують безпосередньо клас CDialog. У загальному ж випадку, необхідно визначати власний клас. Клас CDialog має конструктори з наступними прототипами:

Параметр ResourceName або ResourceID визначає ідентифікатор діалогу в ресурсах, строковий або числовий. Параметр Owner - це покажчик на вікно-власник, якщо дорівнює 0, то власником буде головне вікно програми. Остання форма конструктора призначена для створення немодального діалогів.

Обробка повідомлень від діалогів

Всі діалоги є різновидом вікон, тому для них використовується такий же механізм повідомлень, як і для головного вікна. Для кожного діалогу організовується власна чергу повідомлень, так само точно, як і для головного вікна. Коли елемент управління діалогу активізується, діалогу надсилається повідомлення WM_COMMAND. З цим повідомленням передається ідентифікатор елемента управління. Для обробки повідомлень в карту повідомлень діалогу потрібно помістити макрос ON_COMMAND (). Багато елементів управління генерують також ідентифікаційний код, який дозволяє визначити, який вплив було вироблено з елементом управління. У багатьох випадках за цим кодом вибирається той чи інший обробник.

Виклик модального діалогу

Після того, як об'єкт класу діалогу створений, необхідно викликати член-функцію DoModal (). Результатом виклику буде модальное відображення діалогу. Прототип функції наступний:

virtual int CDialog :: DoModal ();

Функція повертає код завершення, що генерується діалогом при закритті, або -1, якщо вікно не може бути відображено. Якщо при відображенні діалогу сталася помилка, повертається IDABORT. Функція не закінчується, поки діалог не буде закритий.

Закриття модального діалогу

За замовчуванням діалог закривається при отриманні повідомлення з ідентифікатором або IDOK. або IDCANCEL. Вони зумовлені і зазвичай пов'язані з кнопками підтвердження та скасування. Клас CDialog містить вбудовані обробники для цих двох випадків, OnOK () і OnCancel (). Їх не потрібно включати в чергу повідомлень діалогу. Але, їх можна перевизначити, що дає можливість програмісту керувати закриттям діалогу. Для програмного закриття діалогу необхідно викликати член-функцію з прототипом:

void CDialog :: EndDialog (int RetCode);

Параметр визначає значення, яке поверне функція DoModal (). Зазвичай повертаються значення IDOK або IDCANCEL. інші значення використовуються рідко.

Часто на практиці виникає ситуація, коли різні змінні і елементи управління, пов'язані з діалогом, повинні бути ініційовані до того, як діалог буде відображений. Щоб дозволити діалогу виконати подібні дії, Windows автоматично посилає йому повідомлення WM_INITDIALOG в момент створення. При отриманні такого повідомлення MFC автоматично викликає метод OnInitDialog (). який є стандартним обробником, визначеним у класі CDialog. Ця функція переопределяется в програмі, якщо необхідно виконання ініціалізації. Прототип функції:

virtual BOOL CDialog :: OnInitDialog ();

Функція викликається до того, як діалог буде відображений. Вона повинна повертати TRUE. щоб Windows могла передати фокус введення (т. е. зробити активним) на перший елемент управління у вікні. Першою дією в перевизначення функції повинен бути виклик функції CDialog :: OnInitDialog ().

Немодальні діалоги отримують повідомлення паралельно з основним вікном програми. Тобто, як мінімум два вікна будуть одночасно активними. Тому, робота з немодального діалогами вимагає більше зусиль - вживаються додаткові операції. Для створення немодального діалогу, необхідно створити "порожній" об'єкт діалогу, тобто не пов'язаний з шаблоном з ресурсів. Прив'язка до ресурсів здійснюється через функцію Create (...). Розглянемо цей процес докладніше. Для створення об'єкта немодального діалогу, необхідно використовувати конструктор CDialog :: CDialog () без параметрів. Він оголошений як protected-член класу. Це означає, що він може бути викликаний тільки зсередини члена-функції породженого класу. Це зроблено для того, щоб програміст обов'язково визначав свій породжений клас для немодального діалогу, і визначав в ньому додаткові операції для немодального діалогу. Коли екземпляр створений, він прив'язується до ресурсів за допомогою функцій:

Використання діалогу в якості головного вікна

Використання діалогу в якості головного вікна часто буває дуже зручним. Реалізувати цей випадок досить просто. По-перше, необхідно створити діалог в ресурсах. По-друге, породити клас головного вікна програми від CDialog. Перед конструктором класу головного вікна необхідно викликати конструктор класу CDialog. і в ньому прив'язати об'єкт до ресурсів, наприклад:

По-третє, в функції CApp :: InitInstance () повинен бути присутнім наступний код: