Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
27.01.2024
Размер:
31.74 Кб
Скачать

19

СЕРІАЛІЗАЦІЯ СТАНДАРТНИХ ОБ’ЄКТІВ ПІД ЧАС РОБОТИ З

ФАЙЛАМИ

Постановка задачі

Створити однодокументну Windows-програму на C++ ISO|ANSI із

використанням бібліотеки MFC. Передбачити читання рядка символів, запис

його на диск і подальше читання з диска.

// serstandartDoc.cpp: реализация класса CserstandartDoc

//

#include "pch.h"

#include "framework.h"

// SHARED_HANDLERS можно определить в обработчиках фильтров просмотра реализации проекта ATL, эскизов

// и поиска; позволяет совместно использовать код документа в данным проекте.

#ifndef SHARED_HANDLERS

#include "serstandart.h"

#endif

#include "serstandartDoc.h"

#include <propkey.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CserstandartDoc

IMPLEMENT_DYNCREATE(CserstandartDoc, CDocument)

BEGIN_MESSAGE_MAP(CserstandartDoc, CDocument)

END_MESSAGE_MAP()

// Создание или уничтожение CserstandartDoc

CserstandartDoc::CserstandartDoc() noexcept

{

// TODO: добавьте код для одноразового вызова конструктора

}

CserstandartDoc::~CserstandartDoc()

{

}

BOOL CserstandartDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

str = "";

UpdateAllViews(NULL);

// TODO: добавьте код повторной инициализации

// (Документы SDI будут повторно использовать этот документ)

return TRUE;

}

// Сериализация CserstandartDoc

void CserstandartDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

ar << str;

}

else

{

ar >> str;

}

}

#ifdef SHARED_HANDLERS

// Поддержка для эскизов

void CserstandartDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)

{

// Измените этот код для отображения данных документа

dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));

CString strText = _T("TODO: implement thumbnail drawing here");

LOGFONT lf;

CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));

pDefaultGUIFont->GetLogFont(&lf);

lf.lfHeight = 36;

CFont fontDraw;

fontDraw.CreateFontIndirect(&lf);

CFont* pOldFont = dc.SelectObject(&fontDraw);

dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);

dc.SelectObject(pOldFont);

}

// Поддержка обработчиков поиска

void CserstandartDoc::InitializeSearchContent()

{

CString strSearchContent;

// Задание содержимого поиска из данных документа.

// Части содержимого должны разделяться точкой с запятой ";"

// Например: strSearchContent = _T("точка;прямоугольник;круг;объект ole;");

SetSearchContent(strSearchContent);

}

void CserstandartDoc::SetSearchContent(const CString& value)

{

if (value.IsEmpty())

{

RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);

}

else

{

CMFCFilterChunkValueImpl *pChunk = nullptr;

ATLTRY(pChunk = new CMFCFilterChunkValueImpl);

if (pChunk != nullptr)

{

pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);

SetChunkValue(pChunk);

}

}

}

#endif // SHARED_HANDLERS

// Диагностика CserstandartDoc

#ifdef _DEBUG

void CserstandartDoc::AssertValid() const

{

CDocument::AssertValid();

}

void CserstandartDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

// Команды CserstandartDoc

Контрольні питання:

  1. Документ програми на базі бібліотеки MFC – це об’єкт класу, який може

бути досить складним. Як правило, він містить велике різноманіття об’єктів,

кожен з яких містить інші об’єкти. І така структура може поширюватися на

декілька рівнів.

  1. Об'єкти класу містять функції-члени та змінні-члени, кожен з яких має

специфікатори доступу. Щоб зберегти такі об'єкти у зовнішньому файлі,

інформація, що записується в цей файл, повинна містити повні специфікації

усіх структур класів. Процес читання з файла також повинен бути досить

інтелектуальним, щоб повністю синтезувати вихідні об'єкти на основі даних

файла.

  1. Бібліотека MFC підтримує механізм, який називається серіалізацією.

Серіалізація – це процес запису на диск або читання з нього об’єктів класу. У

більшості програм на Visual C++ уся робота з даними відбувається з

документом.

  1. Основна ідея, що лежить в основі серіалізації, полягає в тому, що

будь-який серіалізований клас сам піклується про збереження та відновлення

самого себе. Таким чином, щоб класи додатка стали серіалізованими, вони

повинні записуватися у файл.

  1. Основна можливість серіалізації з самого початку вбудовується Мастером

приложения у програми. Обробники для пунктів меню Файл/Открыть,

Файл/Сохранить, Файл/Сохранить как... передба-чають, що буде серіалізація

документів, і уже містять код, необхідний для її підтримки. Конкретно

використовуються член-функція Serialize(), два макроси і порожній

конструктор для документа.

  1. Якщо елементом даних серіалізованого класу (у нашому випадку класу

CserialstandartDoc) є об'єкт якого-небудь іншого класу, для якого не

перевантажені операції << і >>, то у функції Serialize() елементи даних цього

іншого класу включаються в списки нарівні з елементами даних

серіалізованого об'єкта.

  1. Об'єкт CArchive конструюється або для збереження

об'єктів, або для їх прочитання. Функція IsStoring() повертає TRUE, якщо об'єкт

призначений для запису у файл, і FALSE, якщо для читання.

  1. Необхідно забезпечити очищення екрана при створенні нового

документа. Для цього виділити клас CserstandartDoc, розкрити метод

OnNewDocument().

  1. UpdateAllViews(NULL) - вона інформує всі види,

пов'язані з документом, про те, що цей документ був модифікований і

повинно бути оновлення всіх видів програми новими даними документа.

Соседние файлы в папке еще какието лабки разных вариантов