Класс CPolygon
В соответствии с архитектурой "документ – представление" мы должны ввести в класс документа некоторые новые структуры данных для хранения информации о файлах документов, обнаруженных в выбранной пайке или логическом диске. Файловые пути хранятся в контейнере текстовых строк типа vector<cstring>. Пришлось отказаться от использования класса string из библиотеки STL, так как многие используемые нами методы классов и API-функции требуют в качестве параметров переменные типа CString из библиотеки MFC. Преобразование типов из CString в string и обратно потребует дополнительных усилий, поэтому проще взять CString в качестве аргумента шаблона vector.
Для изображения мини-чертежей найденных документов в правом представлении (CRightview) расщепленного окна (CTreeFrame) удобно ввести в рассмотрение класс CDPoint и тип данных VECPTS:
typedef vector<CDPoint, allocator<CDPoint> > VECPTS;
Эти типы данных мы разработали во втором уроке для обозначения множества реальных (World) координат точек изображаемых объектов. Перенесите указанные объявления из проекта My (см. урок 2) и вставьте их в начало файла TreeDoc.h до объявления класса CTreeDoc, но после директивы #pragma once. Вставляя объявление новых классов в тот же файл, мы экономим свои силы в процессе отладки приложения, потому что нам не надо так часто переключать окна и заботиться о видимости новых типов данных. Однако довольно часто при этом становятся невидимыми для новых классов старые типы, которые декларированы в этом же файле, но чуть ниже. Такие проблемы легко решаются с помощью упреждающих объявлений класса. Вставьте сразу за директивой #pragma once такое объявление:
class CTreeDoc; // Упреждающее объявление
В конец файла StdAfx.h вставьте строки, которые обеспечивают видимость некоторых ресурсов библиотеки STL:
#include <vector> using namespace std;
Кроме того, нам понадобится новый полноценный класс, который инкапсулирует функциональность изображаемого объекта. Объекты этого класса должны быть устойчивы, то есть должны уметь сохранять и восстанавливать свое состояние, также они должны уметь правильно изображать себя в любом контексте устройства, который будет подан им в качестве параметра. Все перечисленные свойства "почти бесплатно" получают классы, произведенные от класса библиотеки MFC cobject. Вставьте в файл TreeDoc.h после строки с определением типа VECPTS, но до объявления класса CTreeDoc, объявление класса CPolygon:
class CPolygon: public CObject { DECLARE_SERIAL(CPolygon) public: CTreeDoc *m_pDoc; // Обратный указатель VECPTS m_Points; // Контейнер вещественных точек UINT m_nPenWidth; // Толщина пера COLORREF m PenColor; // Цвет пера COLORREF m_BrushColor; // Цвет кисти CDPoint m_ptLT; // Координата левого верхнего угла CDPoint m_ptRB; // Координата правого нижнего угла //====== Конструктор по умолчанию CPolygon (); //====== Конструктор копирования CPolygon(const CPolygons poly); //====== Операция присвоения CPolygons operator= (const CPolygons poly); //====== Операция выбора i-той точки CDPointS operator!] (UINT i); //====== Вычисление обрамляющего прямоугольника void GetRect(CDPointS ptLT, CDPointS ptRB); //====== Установка обратного указателя void Set (CTreeDoc *p); //====== Изменение атрибутов void SettCTreeDoc *p,COLORREF bCl,COLORREF pCl,UINT pen); //====== Создание трех простых заготовок void MakeStar(); // Звезда void MakeTria(); // Треугольник void MakePent(); // Пятиугольник //====== Изображение в контексте устройства virtual void Draw (CDC *pDC, bool bContour); //====== Сохранение и восстановление данных virtual void Serialize(CArchiveS ar); virtual ~CPolygon(); // Деструктор //====== Новый тип данных: контейнер полигонов typedef vector<CPolygon, allocator<CPolygon> > VECPOLY;