69274

Діалогові вікна

Лекция

Информатика, кибернетика и программирование

В першу чергу необхідно вивчити, як можна визначити клас, похідний від CDialog. Оскільки демонстраційний додаток розділу володіє діалоговим вікном, що містить всі дані елементи управління, приступимо до його створення прямо зараз. Це буде проект додатку SDI під назвою ControlsDemo.

Украинкский

2014-10-02

45.5 KB

1 чел.

Лекція № 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 відповідно).


 

А также другие работы, которые могут Вас заинтересовать

16070. риміналістична характеристика злочинів 250.5 KB
  Старушкевич А.В. Криміналістична характеристика злочинів: Навч. посібник. К. 1997. 44 с. Вступ Боротьба зі злочинністю е одним із головних державних завдань на будь якій стадії суспільного розвитку. Особливого значення вона набуває в умовах реформування діяльності
16071. Біржова справа 20.06 MB
  Підручник складається з трьох частин і двадцяти розділів. Кожен розділ завершується коротким резюме, контрольними запитаннями, переліком посилань і рекомендованої літератури, тестами для перевірки знань (усього 300), ситуаційними задачами
16072. Біржове право 1.85 MB
  Біржовий ринок у світі давно вже став центром ринкової економіки. Нагромаджено великий досвід роботи бірж, що пройшли історичний розвиток від торгівлі наявною сільськогосподарською продукцією до торгівлі фючерсами й опціонами на всі види товарів і фінансових інструментів. Це сприяло перетворенню бірж з одного із головних каналів оптової торгівлі товарами на центри ціноутворення і страхування ризику.
16073. Професійна мотивація працівників органів внутрішніх справ вивчення та корекція 886.5 KB
  В запропонованому посібнику розглянуті загальні питання вивчення професійної мотивації, а також проаналізовані мотиви вибору професії та професійної діяльності працівників органів внутрішніх справ.
16074. Право пенсійного забезпечення в Україні 1.27 MB
  І.М. Сирота ПРАВО ПЕНСІЙНОГО ЗАБЕЗПЕЧЕННЯ в УКРАЇНІ Курс лекцій Київ Юрінком Інтер 1998 ББК 67.9 4УКР 305 С40 Рекомендовано вченою радою Юридичного інституту Одеського державного університету ім. 1.1. Мечникова Рецензент В.Т. УСЕНКО на
16075. Кримінально-виконавче право України 879 KB
  Кримінальновиконавче право України: Курс лекцій.Семаков Г. С Гель А. П. Київ 2000 [1] ВСТУП [2] ТЕМА 1 КРИМІНАЛЬНОВИКОНАВЧА ПОЛІТИКА І КРИМІНАЛЬНОВИКОНАВЧЕ ПРАВО. НОРМИ ТА ДЖЕРЕЛА ПРАВА. КРИМІНАЛЬНОВИКОНАВЧІ ПРАВОВІДНОСИНИ [3] ТЕМА 2 ...
16076. Мотив і мотивація злочину 928 KB
  НАЦІОНАЛЬНА АКАДЕМІЯ ВНУТРІШНІХ СПРАВ УКРАЇНИ А. В. САВЧЕНКО МОТИВ І МОТИВАЦІЯ ЗЛОЧИНУ Київ Атіка 2002 ББК 67.94УКР308 С12 Рекомендовано до друку спеціалізованою Вченою радою Національної академії внутрішніх справ України Науковий редактор Коржанськи
16077. Держава і економіка. Адміністративно-правові аспекти взаємовідносин 1.62 MB
  МВС України Університет внутрішніх справ О.П.Рябченко Держава і економіка: адміністративноправові аспекти взаємовідносин За загальною редакцією доктора юридичних наук професора О.М. Бандурки Видавництво Університету внут...
16078. Державне управління 621 KB
  Глен Райт. Державне управління. – К. 1994 Переклали з англійської Василь Івашко Олександр Коваленко Світлана Соколик київ основи Інститут державного управління та самоврядування при Кабінеті Міністрів України ББК 67.30165.050 Р18 У посібнику розг...