Отображение графика
//====== Наносим цифровую метку 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); } }