Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

Розділ 8. Діалогові вікна

8.1. Створення діалогового вікна та простіші елементи керування

Приклад роботи знаходиться у папці DISK\dialog\dialog1.

Створимо додаток з назвою Dial. Дана програма дозволяє створювати окремі діалогові вікна та забезпечує виведення результатів роботи діалогових вікон у класі CDialView. Проект формується як додаток SDI.

Послідовність роботи.

1. Створюємо у ресурсах новий діалог. На діалозі розміщуємо два групових поля з найменуваннями «Букет» і «Цветы» (рис. 8.1). Додаємо в группу «Букет» чотири перемикача (radiobutton). У групу «Цветы» додаємо чотири прапорці (checkbox). Крім того додаємо текстове поле. Цей діалог являється інтерфейсом для користувача. У залежності від обраного типу букета показано його набори квітів (галочки на деяких прапорцях). При цьому в полі edit виводиться вартість обраного типу букету. При відкритті діалогу створюється його клас Dialog1.

Рис. 8.1. Робота з діалогом

2. Робота з класом діалогу Dialog1. Додаємо змінну m_text типу CString для зв'язку з текстовим полем. На початку виконання діалогу виведемо у текстове поле слово «Букет». З цією метою необхідно ініціалізувати змінну m_text до появлення діалогу на екрані.

3. Для виклика діалогу у класі CDialDoc додамо функцію OnDocument. Створимо новий пункт у меню та за допомогою ClassWizard, вкладки Message Maps, зв'яжемо його з викликом функції OnDocument().

void CDialDoc::OnDocument()

{

Dialog1 dial;

dial.m_text = sum;

if(dial.DoModal() == IDOK)

sum = dial.m_text;

UpdateAllViews(0);

}

Тут створюється об'єкт класу діалогу dial. При натисненні кнопки “Ok” даного діалогу (див. рис. 8.1) змінній sum, яка створюється та ініціалізується у класі CDialDoc присвоюється значення текстового поля класу Dialog1. Вона знаходиться у секції public цього класу. Функція UpdateAllViews(0) активізує OnDraw() і на екрані виводиться вартість обраного букета. Якщо у діалозі натискається кнопка «Cancel», то на екрані відображається попередня вартість букета. Текст функції OnDraw() має наступний вигляд:

void CDialView::OnDraw(CDC* pDC)

{

CDialDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(10,10,pDoc->sum);

}

Щоб робота з даним діалогом відбувалася у класі CDialView, необхідно підключити файл заголовка діалогу "dialog1.h".

4. За допомогою ClassWizard, вкладки Message Maps, створимо відгуки на чотири радіокнопки (рис. 8.2). Тобто, по відгукам перемикачів (радіокнопок), відповідно, ID_RADIO1, ID_RADIO2, ID_RADIO3, ID_RADIO4 у класі Dialog1 створюються чотири функції OnRadio1(), OnRadio2(), OnRadio3(), OnRadio4(), текст яких наведено ниже.

Рис. 8.2. Додавання функцій-відгуків від перемикачів

void Dialog1::OnRadio1()

{

((CButton*)GetDlgItem(1005))->SetCheck(1);

((CButton*)GetDlgItem(1006))->SetCheck(1);

((CButton*)GetDlgItem(1007))->SetCheck(1);

((CButton*)GetDlgItem(1008))->SetCheck(1);

GetDlgItem(1010)->SetWindowText(" 100 гр.");

GetDlgItem(1010)->GetWindowText(m_tex);

}

void Dialog1::OnRadio2()

{

((CButton*)GetDlgItem(1005))->SetCheck(1);

((CButton*)GetDlgItem(1006))->SetCheck(0);

((CButton*)GetDlgItem(1007))->SetCheck(1);

((CButton*)GetDlgItem(1008))->SetCheck(1);

((CEdit*)GetDlgItem(1010))->SetWindowText(" 80 гр.");

GetDlgItem(1010)->GetWindowText(m_tex);

}

void Dialog1::OnRadio3()

{

((CButton*)GetDlgItem(1005))->SetCheck(1);

((CButton*)GetDlgItem(1006))->SetCheck(0);

((CButton*)GetDlgItem(1007))->SetCheck(0);

((CButton*)GetDlgItem(1008))->SetCheck(1);

((CEdit*)GetDlgItem(1010))->SetWindowText(" 50 гр.");

GetDlgItem(1010)->GetWindowText(m_tex);

}

void Dialog1::OnRadio4()

{

((CButton*)GetDlgItem(1005))->SetCheck(1);

((CButton*)GetDlgItem(1006))->SetCheck(0);

((CButton*)GetDlgItem(1007))->SetCheck(0);

((CButton*)GetDlgItem(1008))->SetCheck(0);

GetDlgItem(1010)->SetWindowText(" 30 гр.");

GetDlgItem(1010)->GetWindowText(m_tex);

}

Функція GetDlgItem повертає вказівку на елемент керування. Дана вказівка має тип CWnd*. Для виклику функції SetCheck, яка ставить або знімає прапорець з елемента, необхідно привести цю вказівку до вказівки на клас CButton (CButton*). Ідентифікатори з номерами від 1005 до 1008 знаходяться у файлі Resource.h:

#define IDC_CHECK1 1005

#define IDC_CHECK2 1006

#define IDC_CHECK3 1007

#define IDC_CHECK4 1008

5. Оскільки при першому виведенні діалогу ми повинні отримати у текстовому полі значення «Букет», необхідно змінну m_text ініціалізувати до виведення діалогу. Це робиться у конструкторі класа діалогу. А булевським змінним треба присвоїти значення false, тобто ні одна із радіокнопок не буде активною.

6. Код функцій OnRadio1, OnRadio2, OnRadio3, OnRadio4 можливо спростити. Для розглядання цього випадку створимо такий же клас діалогу як Dialog1, але з іменем Dialog2. Додамо до нього аналогічні функції та змінну m_text. Додамо у клас діалогу чотири змінних типу bool: m_check1, m_check2, m_check3, m_check4. Додавання цих змінних відбувається за допомогою ClassWizard, вкладка Member Variables (рис. 8.3).

Рис. 8.3. Додавання змінних для роботи з прапорцями

7. На наступному етапі приведемо код функцій OnRadio1, OnRadio2, OnRadio3, OnRadio4:

void Dialog2::OnRadio1()

{

m_check1 = m_check2 = m_check3 = m_check4 = 1;

m_text = " 100 гр.";

UpdateData(0);

}

void Dialog2::OnRadio2()

{

m_check2 = m_check3 = m_check4 = 1;

m_check1 = 0;

m_text = " 80 гр.";

UpdateData(0);

}

void Dialog2::OnRadio3()

{

m_check1 = 1;

m_check2 = 0;

m_check3 = 0;

m_check4 = 1;

m_text = " 60 гр.";

UpdateData(0);

}

void Dialog2::OnRadio4()

{

m_check1 = 1;

m_check2 = 0;

m_check3 = 0;

m_check4 = 0;

m_text = " 30 гр.";

UpdateData(0);

}

В залежності від перемикача булевським змінним присвоюються відповідні значення, а також змінній m_text присвоюється вартість букета. Функція UpdateData() пов'язує елементи керування зі змінними. Якщо аргументом цієї функції є false (або 0), як у нашому випадку, то інформація передається від змінних до елементів керування. І навпаки, якщо аргумент функції true, то значення елементів керування передаються змінним.

7. Розглядаєму задачу можливо виконати на базі створення діалогового вікна. Для цього на першому етапі роботи з AppWizard (Step 1) необхідно вибрати опцію Dialog Based. Тоді при створенні додатку не буде класів документів і видів (C...Doc и C...View), а буде тільки клас діалогу. При цьому на екрані відразу ж з'являється діалог і його формування здійснюється таким же чином, як це було наведено вище – при сотворенні окремого класу Dialog1. Таким чином, під час виконання програми з'являється діалог і результатом роботи задачі буде поява у текстовому полі вартості букета певного типу.

Увага!!! Передача данних у діалог може відбуватися у його конструкторі. Доцільно передавати дані у діалог у виді вказівок. У діалозі вони будуть визначені і змінені за адресою. Також можна використовувати структури, які містять декілька змінних і передавати їх у діалог.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]