Класс графика
С помощью Studio .NET введите в состав проекта новый generic-класс CGraph, не указывая имени базового класса и не включая флажок Virtual destructor. В файл декларации нового класса введите вручную вспомогательный класс CDPoint, необходимость в котором мы обсуждали ранее. Затем добавьте объявление структуры TData, которая собирает воедино все данные, используемые при построении графика. Начальная буква Т в имени класса осталась со времен работы в среде Borland. Там принято все классы именовать начиная с буквы Т (Type), означающей создание нового типа данных. Но в отличие от старой реализации графика, которая, возможно, знакома читателю по книге "Технологии программирования на языке C++" (Издательство СПбГТУ, 1997), мы введем в класс CGraph некоторые новые возможности:
# pragma once class CDPoint { public: //=== Две вещественные координаты точки на плоскости double x, у; //======= Стандартный набор конструкторов и операций CDPoint () { х=0.; у=0.; } CDPoint(double xx, double yy){ х=хх; У=УУ; } CDPoints operator=(const CDPointi pt) { x = pt.x; У = pt.y; return *this; } CDPoint(const CDPointS pt) { *this – pt; } }; //===== Вспомогательные данные, характеризующие //== последовательность координат вдоль одной из осей struct TData ( //===== Порядок в нормализованном представлении числа int Power; //===== Флаг оси X bool bХ; double //======= Экстремумы Min, Max, //======= Множитель – (10 в степени Power) { Factor, //======= Шаг вдоль оси (мантисса) Step, //======= Реальный шаг dStep, //==== Первая и последняя координаты (мантиссы) Start, End, // ======= Первая и последняя координаты dStart, dEnd; }; //===== Класс, реализующий функции плоского графика class CGraph { public: //===== Данные, характеризующие данные вдоль осей TData m_DataX, m_DataY; //===== Контейнер точек графика vector <CDPoint>& m_Points; //===== Текущие размеры окна графика CSize m_Size; //===== Экранные координаты центра окна CPoint m_Center; //===== Заголовок и наименования осей CString m_sTitle, m_sX, m_sY; //===== Перо для рисования CPen m_Pen; //===== Два типа шрифтов CFont m_TitleFont, m_Font; //===== Высота буквы (зависит от шрифта) int m_LH, //===== Толщина пера m_Width; //===== Цвет пера COLORREF m_Clr; //======= Методы для управления графиком CGraph(vector<CDPoint>& pt, CString sTitle, CString sX, CString sY); virtual – CGraph(); //===== Заполнение TData для любой из осей void Scale(TDataS data); //===== Переход к логическим координатам точек int MapToLogX (double d); int MapToLogY (double d); //===== Изображение в заданном контексте void Draw (CDC *pDC); //===== Изображение одной линии void DrawLine(CDC *pDC); //===== Подготовка цифровой метки на оси CString MakeLabel(bool bx, doubles d); };
Класс CGraph сделан с учетом возможности развития его функциональности, так чтобы вы могли добавить в него нечто и он мог бы справиться с несколькими кривыми одновременно. Фактически он представляет собой упрощенную версию того класса, которым мы пользуемся для отображения результатов расчета поля в двухмерной постановке. Отметьте, что структура TData используется как для последовательности абсцисс, так и ординат.