Конструктор
CGraph
Если вы поняли,
что происходит в методе Scale, то дальнейшие манипуляции с данными графика не
вызовут у вас затруднений. Рассмотрим конструктор класса CGraph. В первом параметре
по ссылке он получает контейнер с точками графика. Для того чтобы исключить
копирование всех точек внешнего контейнера, мы инициализируем в заголовке конструктора
свою собственную ссылку m_Points на входной контейнер. Кроме контейнера с точками
графика пользователь объектом CGraph должен передать два текста, помечающих
оси графика (sX, SY) и текст его заголовка (sTitle). В теле конструктора готовим
два объекта типа TData для данных о разметке двух осей, создаем два шрифтовых
объекта и инициализируем переменные управления параметрами линии графика. В
данной реализации мы убрали диалог по изменению атрибутов пера, который вы можете
сделать по своему вкусу.
Примечание
Следует отметить, что
при изображении нескольких кривых функциональных зависимостей на одном графике
необходимо дать пользователю возможность управлять стилем пера для каждой
кривой в отдельности. В начале книги мы рассматривали, как это делается. Кроме
того, следует учитывать существующие традиции изображения научной графики.
Например, можно помечать кривые крестиками, ноликами и т. д. Это делается
с помощью цикла прохода по точкам кривой и вывода в определенных местах растровых
изображений, маркирующих кривую. Эти возможности ввиду необходимости описывать
объекты классов Stingray Objective Grid мы также убрали из данной реализации.
//=======
Конструктор класса CGraph
CGraph::CGraph
(vector<CDPoint>S pt,
CString
sTitle, CString sX, CString sY)
:
m_Points(pt)
{
//=====
Готовим данные, характеризующие оси координат
ZeroMemory(Sra_DataX,
sizeof(TData));
ZeroMemory(sm_DataY,
sizeof(TData));
m_DataX.bX
= true;
m_DataY.bX
= false;
m_sTitle
= sTitle;
m_sX
= sX;
m_sY
= sY;
//=======
Создаем шрифт для оцифровки осей
m_Font.CreateFont(16,0,0,0,100,0,0,0,DEFAULT_CHARSET,
OUT_RASTER_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,FF_DONTCARE,"Arial");
//=======
Выясняем вертикальный размер буквы
TEXTMETRIC
tm; CClientDC dc(0);
dc.SelectObject(Sm_Font);
dc.GetTextMetrics(Stm);
m_LH
= tm.tmHeight;
//=======
Создаем шрифт для вывода заголовка
m_TitleFont.CreateFont(24,О,О,0,100,
0, 0, 0,
DEFAULT_CHARSET,
OUT_RASTER__PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, FF_DONTCARE,
"Times
New Roman");
//=======
Задаем параметры пера
m_Clr
= RGB(0,0,255); m_Width = 2;
}