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


Визуальное редактирование данных - часть 5


//====== контуры двух соседних с узлом линий

if (m_bLock)

{

// Курсор должен показывать операцию перемещения

SetCursor(m_hGrab);

//====== Установка режима

pDC->SetROP2(R2_XORPEN);

//====== Двойное рисование

//====== Сначала стираем старые линии

RedrawLines(pDC, pDoc->MapToLogPt (pDoc->

m_Poly.m_Points[ra_CurID]));

//====== Затем рисуем новые

RedrawLines(pDC, point);

//====== Запоминаем новое положение вершины

pDoc->m_Poly.m_Points[m_CurID] = pt;

}

//====== Обычный режим поиска близости к вершине

else

{

m_CurID = pDoc->FindPoint(pt);

// Если близко, то m_CurID получит индекс вершины

// Если далеко, то индекс будет равен -1

m_bReady = m_CurID >= 0;

//=== Если близко, то меняем курсор

if (m_bReady)

SetCursor(m_hGrab);

}

}

//====== Перерисовка двух линий, соединяющих

//====== перемещаемую вершину с двумя соседними

void CDrawView::RedrawLines (CDC *pDC, CPointS point)

{

CTreeDoc *pDoc = GetDocument();

//====== Ссылка на массив точек текущего полигона

VECPTS& pts = pDoc->m_Poly.m_Points;

UINT size = pts.sizeO;

//====== Если полигон вырожден, уходим

if (size < 2) return;

//====== Индексы соседних вершин

int il = m_CurID == 0 ? size - 1 : m_CurID - 1;

int 12 = m_CurID == size - 1 ? 0 : m_CurID + 1;

// ====== Берем перо и рисуем две линии

pDC->SelectObject(Sm_penLine);

pDC->MoveTo(pDoc->MapToLogPt(pts[11] ) ) ;

pDC->LineTo(point);

pDC->LineTo(pDoc->MapToLogPt(pts[12]));

}

Определение индекса вершины, к которой достаточно близко подобрался указатель мыши, производится в методе FindPoint класса документа. В случае если степень близости недостаточна, функция возвращает значение -1. Вставьте этот метод в файл реализации класса (TreeDoc.cpp):

int CTreeDoc::FindPoint(CDPointS pt)

{

//====== Пессимистический прогноз

int id = -1;

//====== Поиск среди точек дежуоного полигона

for (UINT 1=0; i<m_Poly.m_Points.size(); i++)

{

//=== Степень близости в World-пространстве.



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