Пакет Vstudio7

       

Рисуем вертикальные линии сетки



Рисуем вертикальные линии сетки

for (double x = m_DataX.Start;

X < m_DataX.End - m_DataX.Step/2.;

x += m_DataX.Step) {

//====== Нормируем координату х

double xn = (x - m_DataX.Start) /

(m_DataX.End - m_DataX.Start) - 0.5;

//====== Вычисляем оконную координату

int xi = MapToLogX(xn);

//====== Пропускаем крайние линии,

//====== так как они совпатают с рамкой

if (x > m_DataX.Start && x < m_DataX.End)

{

pDC->MoveTo(xi, bm);

pDC->LineTo(xi, tp); )

//====== Наносим цифровую метку

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);

}

}



Содержание раздела