- •О.С. Зеленський
- •Розділ 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. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
Контрольні питання
1. Призначення функції SetMapMode.
2. Що таке контекст пристрою?
3. Призначення функції GetDeviceCaps.
4. Призначення функції SetMaxPage класу CPrintInfo.
5. Яким чином здійснити переведення пікселів у міліметри?
6. Що включається у додаток при встановленні опції Printing and print preview у AppWizard?
7. Призначення функції OnPreparePrinting.
8. Призначення функції OnPrint.
9. Розкрийте відмінності режимів графічного відображення у пікселях (MM_TEXT) та у 0,01 дюйма (MM_LOENGLISH).
10. Яким чином організовується друк багатосторінкового документу?
11. Опишіть розрахунок кількості сторінок kol_st для розглянутого прикладу з виведенням прямокутників.
12. Розкрийте сутність алгоритму виведення прямокутників на декількох сторінках документу.
Розділ 7. Робота з файлами
7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
Приклад роботи з файлами знаходиться у папці DISK\File\File1.
Дана програма призначена для виконання стандартних операцій роботи з файлами.
Проект формується з використанням режиму діалогу, Dialog Based. Найменування додатку File.
На рис. 7.1 наведемо діалог для роботи з файлами.
Рис.7.1. Діалог для роботи з файлами
У цьому діалозі розміщено 4 кнопки, кожна з яких відповідає за роботу з файлами:
CFile – робота з класом CFile.
fstream1 – робота з потоком fstream (бінарний режим).
fstream2 – робота з потоком fstream (текстовий режим).
CStdioFile – робота з класом CStdioFile.
Розглянемо кожну з них більш детально.
7.1.1. Робота з класом cFile
Клас CFile – це базовий клас бібліотеки MFC для роботи з файлами. Він працює з файлами у двійковому режимі. Похідний від нього клас CStdioFile підтримує роботу з текстовими файлами. Крім того, клас CFile використовується спільно з класом CArchive для зберігання об’єктів класів з бібліотеки MFC.
Приведемо методи для роботи з класом CFile, а також список констант, які визначають режим відкриття файлу.
Методи класу CFile перераховані в табл. 7.1.
Таблиця 7.1
Методи класу CFile
Метод |
Призначення |
Abort |
Закриває файл, ігноруючи будь-які попередження і помилки |
CFile |
Конструює об'єкт класу CFile по заданому шляху або файловому логічному номеру |
Close |
Закриває файл і видаляє об'єкт |
Flush |
Виконує відкладений запис всіх даних |
GetFileName |
Отримує ім'я заданого файлу |
GetLength |
Отримує довжину файлу |
GetPosition |
Отримує поточну позицію файлового курсору |
GetStatus |
Отримує відомості про статус заданого файлу |
LockRange |
Блокує діапазон байтів у файлі |
Open |
Робить безпечне відкриття файлу з можливістю перевірки помилок |
Read |
Читає дані з файлу з поточної позиції |
ReadHuge |
Читає з файлу більше 64К даних, починаючи з поточної позиції. У 32-розрядному програмуванні не відрізняється від Read() |
Remove |
Видаляє заданий файл |
Rename |
Перейменовує заданий файл |
Seek |
Переміщує файловий курсор у задану позицію |
SeekToBegin |
Переміщує файловий курсор на початок файлу |
SeekToEnd |
Переміщує файловий курсор на кінець файлу |
SetFilePath |
Встановлює повний шлях до файлу |
SetLength |
Змінює довжину файлу |
SetStatus |
Встановлює статус файлу |
UnLockRange |
Знімає блокування з діапазону байтів у файлі |
Write |
Записує дані у файл з поточної позиції |
WriteHuge |
Записує у файл більше 64К даних, починаючи з поточної позиції. У 32-розрядному програмуванні не відрізняється від Write() |
Список констант, які визначають режим відкриття файлу в конструкторі CFile, наведено в табл. 7.2.
Таблиця 7.2
Режими відкриття файлів в класі CFile
Константа |
Призначення |
CFile::modeCreate |
Створює новий файл |
CFile::modeNoInherit |
Забороняє спадкування файлу дочірніми процесами |
CFile::modeTruncate |
Комбінується з modeCreate – якщо створюваний файл вже існує, він не обрізається до нульової довжини |
CFile::modeRead |
Відкриває файл тільки для читання |
CFile::modeReadWrite |
Відкриває файл для читання / запису |
CFile::modeWrite |
Відкриває файл тільки для запису |
Продовження таблиці 7.2
Константа |
Призначення |
CFile::shareCompat |
Відсутній в 32-розрядній MFC. При використанні в CFile::Open відповідає CFile:: shareExclusive |
CFile::shareDenyNone |
Відкриває файл, не забороняючи іншим процесам читання / запис |
CFile::shareDenyRead |
Відкриває файл, забороняючи іншим процесам читання з нього |
CFile::shareDenyWrite |
Відкриває файл, забороняючи іншим процесам запис до нього |
CFile::shareExclusive |
Відкриває файл у монопольному режимі, забороняючи іншим процесам читання / запис |
CFile::typeBinary |
Встановлює двійковий режим |
CFile::typeText |
Встановлює текстовий режим із спеціальною обробкою пар символів кінця / переведення рядка |
В нашому прикладі для роботи з файлами (запис та читання з диску) використовується структура st, яка складається із змінної типу int, змінної типу double, та масиву з 10 символів char.
struct st
{
int a;
double b;
char mas[10];
};
Структура проініціалізована наступним чином:
// ------------------------
st ob1;
ob1.a = 65;
ob1.b = 1.5;
strcpy(ob1.mas, "123456789");
// --------------------------
Приведемо відгук OnButton1 на кнопку, яка відповідає за роботу з класом CFile.
// Робота з класом CFile
void CFileDlg::OnButton1()
{
int i;
int n = 5; // для вивода
int kol_st = 100;
// ------------------------
st ob1;
ob1.a = 65;
ob1.b = 1.5;
strcpy(ob1.mas, "123456789");
// --------------------------
st ob2;
char mas[255];
CFileException er;
CFile fp;
CString vr;
if(!fp.Open("1.txt", CFile::modeCreate |
CFile::modeReadWrite |
CFile::typeBinary,&er))
{
er.GetErrorMessage(mas,255);
MessageBox(mas);
return;
}
try
{
for(i = 0; i < kol_st;i++)
{
ob1.a = 65 + i;
fp.Write(&ob1, sizeof(ob1));
}
}
catch( CFileException* e )
{
e->GetErrorMessage(mas,255);
MessageBox(mas);
fp.Close();
return;
}
try
{
fp.Seek((n - 1)*sizeof(st),CFile::begin);
fp.Read(&ob2, sizeof(ob2));
}
catch( CFileException* e )
{
e->GetErrorMessage(mas,255);
AfxMessageBox(mas);
fp.Close();
return;
}
vr.Format(" a = %d b = %f mas = %s ",ob2.a,ob2.b,
ob2.mas);
MessageBox(vr);
fp.Close();
}
У даному фрагменті програми для обробки виключень використовується клас CFileException.
Спочатку ми відкриваємо файл «1.txt» для читання та запису. Якщо файлу на диску не буде – він буде створений. Також до конструктору передається адреса класу обробки виключень CFileException для того щоб у випадку виникнення помилки відобразити її на екрані дисплею. При виникненні помилки відкриття файлу функція Open поверне значення false.
Далі у блоці try … catch() відбувається запис 100 структур на диск, використовуючи функцію Write. Значення параметру a структури накопичується, починаючи з початкового значення, яке дорівнює 65.
На наступному етапі ми переходимо на структуру з номером n (n дорівнює 5) з метою її зчитування. Для цього треба скористатися функцією Seek, щоб перейти на задану позицію, після чого зчитати дані, використовуючи функцію Read. Це представлено у наступному фрагменті.
fp.Seek((n - 1)*sizeof(st),CFile::begin);
fp.Read(&ob2, sizeof(ob2));
Після цього на екрані дисплею роздрукуємо значення 5-ї структури (рис. 7.2.)
Рис. 7.2. Результат роботи з файлами на основі класу CFile
Слід зазначити, що розмір структури залежить від її упаковки – вирівнювання в пам'яті даних для оптимізації роботи компілятора. За упаковку структури відповідає директива препроцесора # pragma pack (n), де n – кількість байт для упаковки. За умовчанням структура упаковується кратно 8 байтам. Для того, щоб розмір структури в байтах відповідав дійсності, потрібно здійснити побайтову упаковку:
# pragma pack (1).