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


 

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

84059. Вход и регистрация в ИСЭД. Подготовка внутреннего документа. Подготовка исходящего документа. Продление срока исполнения поручений в ИСЭД 36.19 KB
  Подготовка внутреннего документа. Подготовка исходящего документа. Подготовка внутреннего документа на основании регламента процесса СПД. Подготовка внутреннего документа Начальные условия процесса: возникла необходимость в подготовке внутреннего документа.
84060. Прием, обработка, регистрация и распределение входящих и внутренних документов в ИОГВ Пермского края. Порядок рассмотрения документов. Организация работы с документами, содержащими служебную информацию ограниченного распространения 41.09 KB
  Инструкция по делопроизводству Прием обработка регистрация и распределение входящих и внутренних документов Доставка документов в Правительство Пермского края администрацию губернатора Пермского края аппарат Правительства Пермского края исполнительные органы государственной власти Пермского края осуществляется как правило средствами почтовой фельдъегерской факсимильной и электрической связи. В исполнительных органах государственной власти Пермского края администрации губернатора Пермского края прием обработка регистрация и...
84061. Взаимодействие мышц с нервной системой, нервно-мышечная единица 29.5 KB
  Выделяют центральную нервную систему которая состоит из головного и спинного мозга и периферическую состоящую из нервов отходящих от головного и спинного мозга межпозвоночных нервных узлов а также из периферического отдела вегетативной нервной системы. ЦНС состоит из спинного и головного мозга. Чем выше расположена та или иная часть мозга тем сложнее ее функции. Продолговатый и средний мозг вместе образуют стволовую часть головного мозга.
84062. Функции крови. Особенности строения клеток и плазмы крови 30.64 KB
  Функции крови. Особенности строения клеток и плазмы крови. От вязкости крови зависят в значительной мере скорость с которой кровь протекает через артерии полуупругие структуры и кровяное давление. Текучесть крови определяется также ее плотностью и характером движения различных типов клеток.
84063. Костный мозг и периферическая кровь 33.34 KB
  Функции: сложнейший процесс образования всех элементов крови разрушение эритроцитов реутилизация железа синтез гемоглобина служит местом накопления резервных липидов принимает участие в реакции иммунного ответа. Все клетки крови происходят от одной стволовой клетки которая в костном мозге размножается и развитие идет по четырем направлениям образование эритроцитов эритропоэз лейкоцитов миелопоэз лимфоцитов лимфопоэз и тромбоцитов тромбоцитопоэз. В промежутках между структурами стромы находятся клетки участвующие в...
84064. Становление работы иммунной системы в детском возрасте 32.21 KB
  Иммунная система комплекс анатомических структур обеспечивающих защиту организма от различных инфекционных агентов и продуктов их жизнедеятельности а также тканей и веществ обладающих чужеродными антигенными свойствами. Иммунная система является одной из важнейших систем человеческого организма. Ребенок встречается с бактериями сразу после рождения и сразу начинает работать иммунная система. Иммунная система детского организма в силу становления и созревания ее различных звеньев характеризуется высокой чувствительностью к действию...
84065. Органы и функции органов пищеварительной системы 42.71 KB
  Они располагаются на границах пищевода и желудка кардиалъный сфинктер желудка и двенадцатиперстной кишки пилорический сфинктер а также в месте перехода подвздошной кишки в слепую и вокруг анального отверстия. Внутренний листок брюшины покрывает большую часть органов пищеварительного канала: желудок и весь кишечник кроме прямой кишки. Эти влияния осуществляются биологически активными веществами образующимися в слизистой оболочке двенадцатиперстной кишки и желудка а также различными пищевыми веществами всосавшимися в кровь из...
84066. Регуляция процесса пищеварения 31.89 KB
  В системе пищеварения происходят три взаимосвязанных процесса секреция моторная функция и всасывания. Конечным результатом деятельности системы пищеварения являются поступления во внутреннюю среду организма питательных веществ воды витаминов электролитов и микроэлементов. Натощак в состоянии покоя органов пищеварения возникает периодическая их деятельность что проявляется сокращением желудка и кишок выделением небольшого количества желудочного сока желчи сока поджелудочной железы и кишечника.
84067. Особенности пищеварительной системы детей раннего возраста 24.75 KB
  Для детей первых месяцев жизни имеют определяющее значение питательные вещества которые поступают с молоком матери и перевариваются за счет веществ содержащихся в самом женском молоке. Всасывание пищевых ингредиентов у детей раннего возраста имеет свои особенности. Расщепление молочного сахара у детей происходит в кайме кишечного эпителия.