Иллюстрированный самоучитель по Visual Studio .NET

Класс графика

С помощью 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 используется как для последовательности абсцисс, так и ординат.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.