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 відповідно).


 

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

65639. Психолого-педагогічні засади підготовки студентів економічних спеціальностей до інноваційної діяльності 369.5 KB
  Здатність до інноваційної діяльності стає значущим компонентом професійної компетентності у будьякій сфері однак особливо важливою є інноваційна підготовка фахівця у сфері економіки. Суттєвим компонентом такої підготовки має бути формування особистісної...
65640. Просодія українського емоційного мовлення (експериментально-фонетичне дослідження) 458 KB
  Неослабний інтерес широкого кола лінгвістів взагалі та фонетистів зокрема до проблем дослідження емоційного мовлення є цілком закономірним в новітню епоху розвитку лінгвістики на антропоцентричних засадах де прагматика посідає чільне місце.
65641. СИСТЕМНІ МЕТОДИ БОРОТЬБИ ЗІ ЗЛОЧИНАМИ В ЕКОНОМІЦІ 204.5 KB
  В сучасних умовах найбільшою небезпекою характеризується злочинність у сфері економіки структура якої визначена законодавцем і як відомо містить у собі три групи злочинів злочини проти власності злочини в сфері економічної діяльності і злочини проти інтересів служби в комерційній і іншій організаціях.
65642. ЕКОЛОГО-ЕКОНОМІЧНІ ОСНОВИ ВИКОРИСТАННЯ БІОІННОВАЦІЙ 304.5 KB
  Одним із таких завдань є оцінка нововведень з позиції їх відповідності умовам відтворення системи екологоекономічних відносин адже наслідки що проявляються у довгостроковій перспективі можуть становити загрозу екологічній безпеці та стійкому розвитку економіки України.
65643. ПАТОГЕНЕТИЧНІ МЕХАНІЗМИ ПРОГРЕСУВАННЯ ЛЕГЕНЕВОЇ НЕДОСТАТНОСТІ ПРИ ПОЄДНАНОМУ ПЕРЕБІГУ ХРОНІЧНИХ ГНІЙНО-ДЕСТРУКТИВНИХ ЗАХВОРЮВАНЬ ЛЕГЕНІВ І ЦИРОЗУ ПЕЧІНКИ ТА ЇХНЯ КОРЕКЦІЯ 224 KB
  Особливі надії на вирішення проблеми гнійних форм ХНЗЛ повязують з підвищенням ефективності антибактеріальної терапії із своєчасним і раціональним використанням ендоскопічної діагностики і терапії хірургічного лікування реабілітації хворих у післяопераційному періоді...
65644. НАПРЯМИ ПІДВИЩЕННЯ ЕКОНОМІЧНОЇ ЕФЕКТИВНОСТІ ВИРОБНИЦТВА ТА ПЕРЕРОБКИ ОВОЧІВ ВІДКРИТОГО ҐРУНТУ 361 KB
  Сприятливі ґрунтовокліматичні умови в Україні створюють необхідні передумови та значний економічний потенціал для організації ефективного виробництва овочів відкритого ґрунту. Незважаючи на те що площі їхніх посівів збільшуються ефективність...
65645. ОПЕРНА ТВОРЧІСТЬ ФРАНЦА ШРЕКЕРА: ПРОБЛЕМИ ЦІЛІСНОСТІ СТИЛЮ 174.5 KB
  Творчість видатного австрійського композитора диригента педагога Франца Шрекера 1878-1934 є однією з малодосліджених сторінок у вітчизняному музикознавстві. І хоча ці найяскравіші твори Шрекера впродовж 10х років ХХ століття здобули успіх майже на всіх провідних оперних сценах Західної Європи...
65646. ФОРМУВАННЯ БАЗОВИХ УПРАВЛІНСЬКИХ КОМПЕТЕНЦІЙ У МАЙБУТНІХ МЕНЕДЖЕРІВ ЕКОНОМІЧНОГО ПРОФІЛЮ ЗАСОБАМИ ІНТЕРАКТИВНИХ ТЕХНОЛОГІЙ 199.5 KB
  Постійне збільшення обсягу знань до якого необхідно вивести майбутнього фахівця за роки навчання у вищому навчальному закладі ВНЗ підвищення вимог до його професійної і спеціальної підготовки не може не викликати гостру потребу всебічного та глибокого дослідження системи формування в студентів...
65647. Державне управління системою охорони здоров’я на регіональному рівні 469.5 KB
  Горького завідувач кафедри організації вищої освіти управління охороною здоров’я і епідеміології ФІПО; доктор наук з державного управління доцент Карамишев Дмитро Васильович Національний фармацевтичний університет завідувач кафедри менеджменту і адміністрування...