Найбільш важливі члени класу 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".