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


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


Преобразование координат осуществляется в два этапа:

  • сначала из Device-пространства в пространство Page (функция DPtoLP — Device Point to Logical Point);

  • затем из Page-пространства в пространство World (наша функция MapToWorldPt).

Теперь вы, вероятно, подготовлены к восприятию того, что происходит в следующих трех методах класса CDrawView. Первые два вы должны создать как реакции на сообщения WM_LBUTTONDOWN и WM_MOUSEMOVE, а последний (member function) — просто поместить в файл реализации класса, так как его прототип уже существует:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

{

//====== В режиме создания нового полигона

if (m_bNewPoints)

{

CTreeDoc *pDoc = GetDocument();

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

VECPTSS pts = pDoc->m_Poly.m_Points;

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

CDC *pDC = GetDC() ;

//====== Настраиваем его с учетом размеров окна

SetDC(pDC) ;

//=== Преобразуем аппаратные координаты в логические

pDC->DPtoLP(ipoint);

//=== Преобразуем Page-координаты в World-координаты

CDPoint pt = pDoc->MapToWorldPt(point);

//====== Запоминаем в контейнере

pts.push_back (pt);

}

//====== В режиме готовности к захвату

else if (m_bReady)

{

ra_bLock = true; // Запоминаем состояние захвата

m_bReady = false; // Снимаем флаг готовности

}

//====== В режиме повторного нажатия

else if (mJbLock)

m_bLock = false; // Снимаем флаг захвата

else

//В случае бездумного нажатия

return; // уходим

Invalidated; // Просим перерисовать

}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)

{

//=== В режиме создания нового полигона не участвуем

if (m_bNewPoints) return;

//====== Получаем и настраиваем контекст

CDC *pDC = GetDCO ;

SetDC(pDC);

//=== Преобразуем аппаратные координаты в логические

pDC->DPtoLP(Spoint);

//=== Преобразуем Page-координаты в World-координаты

CTreeDoc *pDoc = GetDocument();

CDPoint pt = pDoc->MapToWorldPt(point);

//====== Если был захват, то перерисовываем



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