- •О.С. Зеленський
- •Розділ 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. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
7.2. Серіалізація даних, клас cArchive
Приклад роботи з серіалізацією даних знаходиться у папці DISK\File\writer.
Серіалізацією називається процес запису або читання деякого об'єкта з диска. У даному блоці наведено процес серіалізації як стандартних, так і нестандартних об'єктів (класів).
У даному блоці наведено дві програми. Перша з них, writer, дозволяє вводити текст з клавіатури, поміщати його в змінну типу CString, а потім використовуючи серіалізацію, записувати даний рядок на диск, а також зчитувати його. Друга програма призначена для серіалізації нестандартних об'єктів і називається serializer.
Послідовність роботи.
1. Створимо однодокументну (Single) програму writer. Для початку створимо змінну StringData класу CString в класі CWriterDoc і ініціалізуємо її в конструкторі: StringData = "".
2. Для введення тексту з клавіатури в змінну StringData, створимо в класі CWriterView метод OnChar(), який виконується за повідомленням WM_CHAR.
void CWriterView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CWriterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->StringData+= nChar;
Invalidate();
pDoc->SetModifiedFlag();
CView::OnChar(nChar, nRepCnt, nFlags);
}
Для відображення тексту у вікні викликається метод OnDraw(), фрагмент програми якого наводиться нижче:
void CWriterView::OnDraw(CDC* pDC)
{
CWriterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0,0,pDoc->StringData);
}
3. Серіалізація об'єкта StringData виконується за допомогою функції Serialize() класу CWriterDoc.
void CWriterDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << StringData;
}
else
{
ar >> StringData;
}
}
Цій функції передається об'єкт класу CArchive. Спочатку викликається метод IsStoring() об'єкту ar, який повертає true, якщо виконується запис на диск (натискання опції меню "Save" або "Save As"). В іншому випадку з диска зчитується раніше створений файл, який містить рядок. При закритті програми, якщо рядок не був записаний на диск, на екрані виведеться повідомлення про виконання цієї дії. Це можливо тільки в тому випадку, якщо у функції OnChar() буде викликаний метод SetModifiedFlag().
Приклад роботи з серіалізацією об’єктів знаходиться у папці DISK\File\Serializer.
4. Створимо новий клас CData, дані якого будуть записуватися та зчитуватися з диску. Для його створення необхідно виконати команду меню Visual C++ File → New, виділити опцію C/C++ Header File і в полі File Name ввести ім'я файлу CData.h. Вміст цього файлу наводиться нижче.
class CData : CObject
{
private:
CString data;
DECLARE_SERIAL(CData);
public:
CData() {data = CString("");}
void AddText(CString text)
{data += text;}
void DrawText(CDC* pDC)
{pDC-> TextOut(0,0,data);}
void ClearText() {data = "";}
void Serialize(CArchive& archive);
};
У цьому класі всі функції визначені при його оголошенні, за винятком функції Serialize(), в якій відбувається серіалізація об'єкта.
Дана функція визначена у файлі CData.cpp. Для його створення необхідно виконати команду меню Visual C++ File → New, потім виділити опцію C++ Source File і в полі File Name ввести ім'я файлу CData.cpp. Приведемо зміст цього файлу:
#include "stdafx.h"
#include "SerializerDoc.h"
void CData::Serialize(CArchive & archive)
{
CObject::Serialize(archive);
if (archive.IsStoring())
{
archive << data;
}
else
{
archive >> data;
}
}
IMPLEMENT_SERIAL(CData, CObject,0)
5. Об'єкт класу CData помістимо в клас CSerializerDoc, а в конструкторі цього класу зробимо його оголошення. При цьому не забудьте включити заголовок класу CData (CData.h).
#include "CData.h"
class CSerializerDoc : public CDocument
{
protected:
CSerializerDoc();
DECLARE_DYNCREATE(CSerializerDoc)
public:
CData DataObject;
.............................................................
}
6. Щоб зробити серіалізацію об'єкта DataObject в нашому документі необхідно у функції Serialize() класу CSerializerDoc помістити лише один рядок:
void CSerializerDoc::Serialize(CArchive& ar)
{
DataObject.Serialize(ar);
}
7. Для формування об'єкта DataObject (заповнення його рядку типу CString і виведення його у вікно), функції OnChar() і OnDraw() будуть мати такий вигляд:
void CSerializerView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CSerializerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->DataObject.AddText(CString(nChar));
Invalidate();
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CSerializerView::OnDraw(CDC* pDC)
{
CSerializerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->DataObject.DrawText(pDC);
}