Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекція № 16

.doc
Скачиваний:
2
Добавлен:
16.12.2018
Размер:
46.59 Кб
Скачать

Лекція № 16

Тема: Діалогові вікна

План

  1. Визначення класу, похідного від CDialog

  2. Найбільш важливі члени класу CDialog

  3. Відображення і управління модальним діалоговим вікном

Визначення класу, похідного від CDialog

В першу чергу необхідно вивчити, як можна визначити клас, похідний від CDialog. Оскільки демонстраційний додаток розділу володіє діалоговим вікном, що містить всі дані елементи управління, приступимо до його створення прямо зараз. Це буде проект додатку SDI під назвою ControlsDemo. Як тільки файли проекту будуть створені, відкрийте панель Resource View (Ресурси) і розверніть її елементи так, щоб можна було побачити теку Dialog (Діалогові вікна). Клацніть на ній правою кнопкою миші і в контекстному меню, що з'явилося, виберіть пункт Insert Dialog (Додати діалогове вікно). На екрані з'явиться редактор діалогових вікон, що містить новий ресурс шаблону діалогового вікна. Це вікно вже містить дві кнопки з написами ОК і Cancel відповідно. Звідси і далі в цьому розділі, коли мова йтиме про шаблон (template), розуміти під ним слід ресурс шаблону діалогового вікна, який можна проглянути в редакторові діалогових вікон, а коли мова йтиме про діалогове вікно (dialog), розуміти під ним слід фактичне вікно, що відображається на екрані під час виконання додатку.

Щоб легко було переглядати і редагувати код, оброблювальний численні події діалогового вікна, можна динамічно підвантажити в ресурс клас процедури вікна (window procedure) (званою також процедурою діалогового вікна) і обробляти всі необхідні повідомлення саме там. Але до таких крайнощів доводиться вдаватися рідко, оскільки застосування бібліотеки MFC дозволяє уникнути підходів програмування, властивих SDK Windows. Взамен бібліотека MFC надає клас CDialog, що дозволяє легко і просто створювати, відображати і маніпулювати діалоговими вікнами. Таким чином, досить визначити клас, похідний від CDialog, а потім асоціювати (угрузати) його з необхідним шаблоном. Немає нічого простішого.

Як тільки шаблон буде створений, клацніть двічі на нім, утримуючи натиснутою клавішу Ctrl (або виберіть в меню Project (Проект) пункт Add Class (Додати клас)). В результаті оудет запущений той же самий майстер MFC Class Wizard, який вже не раз використовувався в цій книзі. Будучи запущеним з редактора діалогових вікон, майстер MFC Class Wizard відобразить тільки ті базові класи, які мають відношення до шаблонів, а саме: CDHTMLDialog, CDialog, CFormView, COlePropertyPage і CPropertyPage. Тут необхідно бути уважним, оскільки базовим класом за умовчанням заданий HtmlDialog. Отже, в першу чергу необхідно замінити цей клас на lalog. Тепер введіть значення в полі імені класу. У демонстраційному застосуванні розділи використовується ім'я CModalTestDlg. (Звернете увагу, це відповідає стандартній угоді MFC про іменування, відповідно до якого до імені класу, похідного від CDialog, додається слово "Dig".) Як можна відмітити, інші поля заповнюються автоматично, на підставі імені класу, і не можуть бути змінені уручну. Після клацання на кнопці Finish (Готово) створення класу, похідного від CDialog, буде завершено, а крім того, він буде асоційований з ідентифікатором ресурсу шаблону. В даному випадку, оскільки ідентифікатор не був змінений (для цього застосовується діалогове вікно шаблону Properties), а також у зв'язку з тим, що це перше створюване діалогове вікно, значенням ідентифікатора буде IDD_DIALOGl. Незабаром це значення буде застосовано. Тепер розглянемо деякі з найбільш важливих функцій, створених майстром.

Найбільш важливі члени класу CDialog

У найпростішому вигляді клас, похідний від CDialog (створюваний автоматично), містить не так вже і багато членів, оскільки велику частину свого коду він успадковує з базового класу CDialog. Але він володіє деякими дуже важливими функціями і змінними-членами. Їх розгляд допоможе зрозуміти, як саме створюються діалогові вікна і як вони функціонують.

В першу чергу розглянемо конструктор класу діалогового вікна. Конструктору CModalTestDlg передають тільки один параметр — покажчик класу CWnd, який указує на вікно, що є батьківським для даного діалогового вікна. За умовчанням цей параметр містить значення NULL, що означає, що створюється екземпляр головного вікна додатку (яке батьківським вікном не володіє).

CModalTestDlg::CModalTestDlg{CWnd* pParent /*=NULL*/)

: CDialog(CModalTestDlg::IDD, pParent)

{

}

Як можна відмітити, конструктор CModelTestDlg передає деякі дані конструктору базового класу CDialog. Тому розглянемо конструктор CDialog.

CDialog::CDialog(

LPCTSTR IpszTemplateName, CWnd* pParentWnd = NULL

);

CDialog::CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);

CDialog::CDialog ();

Між першими двома версіями конструктора існує тільки одне відмінність, що полягає в способі визначення шаблону. У першій версії задається ім'я шаблону, а в другій використовується ідентифікатор ресурсу. У конструктор CModalTestDlg передається значення ідентифікатора CModalTestDlg: :IDD. Якщо відкрити файл ModalTestDlg.h, то можна відмітити, що IDD визначений так, як показане ниже- Тут можна побачити також ідентифікатор ресурсу, створений автоматично в редакторові діалогових вікон. У такий спосіб шаблон діалогового вікна асоціюється з класом, похідним від CDialog.

enum { IDD = IDD_DIALOGl };

Отже, з'ясувавши, як отримати ідентифікатор ресурсу для другої версії конструктора CDialog, можна перейти до розгляду способу, що дозволяє отримати ім'я ресурсу для першої версії конструктора. Для вирішення подібних задач SDK Win32 надає макрокоманду MAKEINTRESOURCE, яка повертає ім'я ресурсу у відповідь на переданий числовий ідентифікатор ресурсу. Таким чином, у разі IDD_DIALOGl цю макрокоманду можна було б використовувати таким чином:

MAKEINTRESOURCE (IDD_DIALOGl)

Третій конструктор (без параметрів) використовується в тих ситуаціях, коли діалогове вікно створюється з шаблону, який вже знаходиться в пам'яті, а отже, ідентифікатора ресурсу не потребує. Такий конструктор використовується дуже рідко і в цій книзі не розглядається.

Наступною заслуговуючою уваги функцією є DoDataExchange. Ця функція використовується для обміну даними (DDX і DDV) — докладніша інформація по цій темі приведена в розділі "Прімененіє DDX і шаблону елементу управління діалогового вікна", — а поки достатньо знати, що вона забезпечує обмін даними між елементами управління діалогового вікна і класами елементів управління MFC або змінними-членами, що містять дані елементів управління.

void CModalTestDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

Наступне, на що має сенс звернути увагу, — це карта повідомлень (message map) діалогового вікна. Під час виконання додатку її код співвідносить повідомлення і команди з відповідними функціями-членами, званими обробниками (handle).

BEGIN_MESSAGE_MAP(CModalTestDlg,CDialog)

END_MESSAGE_MAP()

І нарешті, остання регулярно використовувана функция— OnlnitDialog. У середовищі розробки Visual Studio .NET (на відміну від попередніх версій Visual Studio) по не до кінця зрозумілих причинах ця функція не створюється автоматично майстром під час створення класу, похідного від CDialog. Тому її доводиться додавати самостійно, за допомогою діалогового вікна Overrides (Перевизначення). Докладніша інформація по цій темі і інструкція приведені в розділі "Перевизначення функцій базових класів" розділу 1, "Перший додаток MFC".

Відображення і управління модальним діалоговим вікном

Отже, клас діалогового вікна створений. Давайте розглянемо тепер, як відображати це вікно і управляти їм. До цих пір мова йшла лише про модальні діалогові вікна. Модальне діалогове вікно (modal dialog) не дозволяє користувачам взаємодіяти ні з одним Іншим діалоговим вікном в тому ж самому потоці (тобто не дозволяє перемкнутися на інше вікно). Немодальне діалогове вікно (modeless dialog), що розглядається в наступному розділі, Допускає взаємодію з іншими вікнами того ж самого потоку, а її конструкція декілька відмінна.

Відображення модального діалогового окна— це простій процес, що складається з двох етапів. Спочатку створюється об'єкт діалогового вікна, а потім здійснюється виклик його функції-члена DoModal1, що і приводить до блокування поточного потоку до тих пір, поки диалого-вое вікно не буде закрито.

CModalTestDlg dlg;

dlg.DoModal();

Але іноді можна зустріти синтаксис функції DoModal, приведений нижче. Тут в одному рядку здійснюється як створення діалогового вікна, так і виклик функції.

CModalTestDlg().DoModal();

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

virtual int CDialog::DoModal();

Щоб побачити, як це працює, додамо в проект додатку ControlsDemo спливаюче меню Controls, а потім додамо в нього пункт на ім'я Modal Dialog (Модальне діалогове вікно). У клас CMainFrame додамо обробник команд і реалізуємо його код таким чином:

void CMainFrame::OnControlsModaldialog()

{

CModalTestDlg dig;

int nRet = dig.DoModal() ;

// Обробка значень, повертаних функцією DoModal

switch (nRet)

{

case -1:

AfxMessageBox ("Dialog box could not be created1.");

break;

case IDABORT:

AfxMessageBox("Dialog aborted");

break;

case IDOK:

AfxMessageBox("OK button pressed");

break;

case IDCANCEL:

AfxMessageBox("Cancel button pressed");

break;

default:

AfxMessageBox("Unknown result");

break;

}

Щоб підключити клас CModalTestDlg, необхідно додати в початок файлу заголовка класу головного фреймового вікна наступний директиву #include:

#include "ModalTestDlg.h"

Якщо відкомпілювати і запустити додаток зараз, то при клацанні на кнопці ОК або Cancel на екрані буде відображено повідомлення, що оповіщає про вибрану кнопку (IDOK або IDCANCEL відповідно).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]