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


 

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

65725. Отоліти та зуби костистих риб палеогену України 538 KB
  Костисті риби переважають у складі кайнозойської іхтіофауни. Окрім скелетних решток самостійним обєктом дослідження є розрізнені отоліти та зуби костистих риб. Костисті риби з палеогенових відкладів України були вивчені в основному за повноскелетними рештками.
65726. Цілеспрямована стимуляція перебудови полів дефектів структури кристалів CdZnTe і ZnSe:Te 501.5 KB
  Однак при сучасній цифровій обробці частина інформації віртуальна тому при комплексному дослідженні впливу перебудови полів дефектів структури на кінетичні фотоелектричні та фотодіелектричні характеристики кристалів необхідно використовувати взаємоузгодженні алгоритми і програми.
65727. ПОВЕРХНЕВI ТА ТУНЕЛЬНI ЕФЕКТИ В МЕТАЛЕВИХ НАНОСТРУКТУРАХ 820 KB
  Розвинути теорiю одноелектронного тунельного транспорту в кластерних структурах з урахуванням нагрiву електронної пiдсистеми кластерiв і уширення енергетичних рiвнiв. Для досягнення поставленої мети необхiдно було вирiшити наступнi задачi: розвинути метод функцiонала густини для...
65728. ЗАЛЕЖНІСТЬ ФІЗИЧНИХ ВЛАСТИВОСТЕЙ НУКЛЕОТИДІВ І ПРОМОТОРІВ ВІД ЇХНІХ ФУНКЦІОНАЛЬНИХ І ЕВОЛЮЦІЙНИХ ХАРАКТЕРИСТИК 722 KB
  Саме виявлення та дослідження взаємозвязків між фізичними властивостями промоторів та їхньою біологічною активністю проводиться в дисертаційній роботі. Знання перелічених закономірностей і залежностей дає змогу зрозуміти енергетичні характеристики генетичного коду...
65729. Релігійне виховання в закладах загальної середньої освіти ФРН: 1945-2005 роки 166.5 KB
  У контексті європейського партнерства одним зі стратегічних завдань української освіти стало виховання високоморальних громадян які могли б налагоджувати міжлюдські й міжнаціональні взаємовідносини сприяти суспільно-економічному та культурному розвитку нашої держави.
65730. ЦІННІСНИЙ ДИСКУРС СТУДЕНТСЬКОЇ МОЛОДІ В ПЕРІОД РИНКОВИХ ТА ДЕМОКРАТИЧНИХ ТРАНСФОРМАЦІЙ 178 KB
  Актуальність дослідження проблеми ціннісного дискурсу студентської молоді обумовлена необхідністю формування відповідей на виклики які сьогодні делегує студентській молоді дійсність економічні політичні та соціокультурні зміни як всередині країни так і на міжнародному рівні.
65731. Моделі та методи аналізу сервіс-орієнтованих інформаційно-обчислювальних систем 289.5 KB
  Математичне моделювання є одним з найбільш поширених методів що дозволяє вирішити цю задачу. Використання ж методів імітаційного моделювання не дозволяє отримати формалізовані залежності між показниками якості та параметрами системи.
65732. ПЕДАГОГІЧНІ УМОВИ ПІДВИЩЕННЯ КВАЛІФІКАЦІЇ ВЧИТЕЛІВ МИСТЕЦЬКИХ ДИСЦИПЛІН У СИСТЕМІ ПІСЛЯДИПЛОМНОЇ ОСВІТИ 170.5 KB
  У сучасному постіндустріальному суспільстві ідеал гармонійно розвинутої особистості також набуває нового змісту тому система художньоестетичного виховання потребує появи вчителя нової формації особливо вчителя мистецьких дисциплін який має вирішувати ряд основних завдань...
65733. ФУНКЦІЇ ОРГАНІВ ДОСУДОВОГО СЛІДСТВА В КРИМІНАЛЬНОМУ ПРОЦЕСІ УКРАЇНИ 182 KB
  У науці кримінального процесу концепція щодо визначення кримінальнопроцесуальних функцій має більш як сторічну історію. Це пояснюється насамперед тим що правильне визначення кримінально-процесуальних функцій та їх...