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

Отображение графика

//====== Наносим цифровую метку
pDC › TextOut (xi, bm+m_LH, MakeLabel(true, x)); }
//=== Повторяем цикл для горизонтальных линий сетки
pDC › SetTextAlign(ТА RIGHT | TA_BASELINE);
for (double у = m_DataY.Start;
у < m_DataY.End – m_DataY.Step/2.; у += m_DataY.Step)
{
double yn = (y – m_DataY.Start) /
(m_DataY.End – m_DataY.Start) -0.5;
int yi = MapToLogY(yn);
if (y > m_DataY. Start &S, у < m_DataY.End)
{
pDC › MoveTo(lt, yi);
pDC › LineTo(rt, yi);
pDC › TextOut(lt-m_LH/2,yi,MakeLabel (false, y));
}
}
//====== Вывод меток осей
pDC › TextOut(lt-m_LH/2, tp – m_LH, m_sY);
pDC › SetTextAlign(TA_LEFT | TA_BASELINE);
pDC › TextOut(rt-m_LH, bm + m_LH, m_sX);
//====== Вывод заголовка
if (ra_sTitle.GetLength() > 40)
m_sTitle.Left(40);
pDC › SelectObject(Sm_TitleFont);
pDC › SetTextAlign(TA_CENTER | TA_BASELINE);
pDC › TextOut((It+rt)/2, tp – m_LH, m_sTitle);
//====== Вывод линии графика
DrawLine(pDC);
//====== Восстанавливаем инструменты GDI
pDC › RestoreDC(nDC);
}

Вывод линии графика начинается с создания и выбора пера. Эти действия можно вынести и поместить в какой-нибудь диалог по изменению атрибутов пера, но мы не будем этого делать, так как данное действие целесообразно только в случае, когда график состоит из нескольких линий. Обе координаты каждой точки сначала нормируются переходом к относительным значениям в диапазоне (-0.5*0.5), затем приводятся к оконным. После чего точки графика последовательно соединяются с помощью GDI-функции LineTo:

void CGraph::DrawLine(CDC *pDC) {
//====== Уничтожаем старое перо
if (m_Pen.m_hObject)
m_Pen.DeleteObject(); //====== Создаем новое
m_Pen.CreatePen(PS_SOLID, m_Width, m_Clr);
pDC › SelectObject(im_Pen);
double x0 = m_DataX.dStart,
y0 = m_DataY.dStart,
dx = m_DataX.dEnd – x0,
dy = m_DataY.dEnd – y0;
//====== Проход по всем точкам
for (UINT i=0; i < m_Points.size(); i++) {
//====== Нормируем координаты
double x = (ra_Points[i].x – xO) / dx – . 5,
у = (m_Points[i].у – y0) / dy – . 5;
//====== Переход к оконным координатам
CPoint pt (MapToLogX(x),MapToLogY(y));
//====== Если точка первая, то ставим перо
if (i==0)
pDC › MoveTo(pt);
else
pDC › LineTo(pt);
}
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.