- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
Розділ 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. Таким чином, під час виконання програми з'являється діалог і результатом роботи задачі буде поява у текстовому полі вартості букета певного типу.
Увага!!! Передача данних у діалог може відбуватися у його конструкторі. Доцільно передавати дані у діалог у виді вказівок. У діалозі вони будуть визначені і змінені за адресою. Також можна використовувати структури, які містять декілька змінних і передавати їх у діалог.