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


Конструкторы и операции - часть 3


За это приходится платить несколькими лишними строками кода, в котором все точки контейнера либо помещаются в архив, либо выбираются из него:

void CPolygon: :Serialize (CArchiveS ar) {

//====== Если идет запись в архив,

if (ar. IsStoring() }

{

//=== то последовательно переносим туда все данные

m « m_nPenWidth « m_PenColor « m_BrushColor « m_Points. size () « m_ptLT.x « m_ptLT.y « m_ptRB.x « m_ptRB.y;

for (UINT i=0; i <m_Points . size 0 ;

m « m_Points [i] .x « m_Points [i] . y;

}

else

{

//=== При чтении из архива меняем направление обмена

UINT size;

m » m_nPenWidth » m_PenColor » m_BrushColor

» size » m_ptLT.x » m_ptLT.y

» m_ptRB.x » m_ptRB.y;

//====== Заново создаем контейнер точек полигона

m_Points . clear ( ) ;

while (size--)

{

double x, y;

m » x » y;

m_Points. oush back (CDPoint (x, v) ) ;

}

}

}

Ниже приведена функция рисования полигона в переданный ей в качестве параметра контекст устройства. Второй параметр является флагом, который задает способ заливки полигона. В операциях визуального редактирования, которое мы введем позже, полигон должен временно терять свой цвет, для того чтобы не было мелькания при частых перерисовках.

Напомним, что полигон хранит World-координаты всех своих точек в контейнере m_Points. Переход к Page-координатам производится с помощью функции MapToLogPt, которую мы еще должны разработать и поместить в класс документа. Двигаясь далее по коду функции Draw, мы видим, как объект настраивает контекст устройства с помощью своих личных атрибутов и изображает себя в этом контексте:

void CPolygon::Draw (CDC *pDC, bool bContour)

{

//====== Размер контейнера World-координат точек

UINT nPoints = m_Points.size();

if (!nPoints) return;

//====== Временный массив логических координат точек

CPoint *pts = new CPoint[nPoints];

//====== Преобразование координат

for (UINT i=0; KnPoints; i++)

pts[i] = m_pDoc->MapToLogPt(m_Points[i]);

pDC->SaveDC();

CPen pen (PS_SOLID,m_nPenWidth,m_PenColor);

pDC->SelectObject(Spen);

CBrush brush (bContour ? GetSysColor(COLOR_WINDOW) : m_BrushColor);

pDC->SelectObject(ibrush);

//====== Полигон изображается в предварительно

//====== подготовленном контексте устройства

pDC->Polygon(pts, nPoints);

//====== Освобождаем массив

delete [] pts;

pDC->RestoreDC(-1);

}




Начало  Назад  Вперед