Рисование
в контексте устройства
Сейчас важно
понять следующее. Пример моделирует ситуацию, когда мы имеем реальные World-координаты
(термин, принятый в GDI) какого-то объекта, например разрез корабля, и хотим
начертить его детали, которые всегда можно аппроксимировать многоугольниками
в некоторой логической системе координат (например, листе ватмана размером 1000x1000
мм). При этом мы преобразуем реальные вещественные координаты корабля в логические,
то есть целого типа, так как мы не можем чертить с погрешностью менее 1 мм.
В соответствии с концепцией рисования в контексте устройства именно эти (логические)
координаты мы и должны использовать в функциях рисования. При последующем выводе
рисунка на экран или принтер операционная система автоматически преобразовывает
каждую его точку в аппаратные (device) координаты, зависящие от типа и возможностей
устройства вывода. Таким образом, мы имеем дело с тремя системами координат
и двумя их преобразованиями.
Примечание
Если вы посмотрите справку по теме Coordinate Spaces and Transformations (Пространства и преобразования координат), то вы увидите, что в GDI рассматриваются четыре координатных пространства: World, Page, Device и Physical device, однако часто можно использовать только два (Page и Device). При этом пространства World и Page считаются одним логическим координатным пространством, а пространства Device в Physical device — физическим. Преобразование из пространства Device в Physical device ограничивается только подстройкой начала координат при отображении рисунка на каком-то конкретном устройстве вывода.
Вызовите в
окно редактора функцию On Draw. Для этого снова щелкните вкладку MyView.cpp
группы окон, вероятно, слева и введите изменения в соответствии со следующим
фрагментом:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc*
pDoc = GetDocument();
ASSERT_VALID(pDoc)
;
//=======
Узнаем размер контейнера точек
UINT
nPoints = pDoc->m_Points.size() ;
//=======
Уходим, если он пуст
if (InPoints)
return;
//===
Сохраняем текущее состояние контекста
//===
(инструменты GDI)
pDC->SaveDC
() ;
//
===
Создаем перо Windows для прорисовки контура
CPen
pen (PS_SOLID,2,RGB(0,96,0));
//===
Выбираем его в контекст устройства
pDC->SelectObject
(Spen);
//
===
Создаем
кисть Windows для закраски внутренности
CBrush
brush (RGB(240,255,250));
pDC->SelectObject
(&brush);
//=====
Изображаем полигон
pDC->Polygon
(spDoc->m_Poihts[0], nPoints);
//Восстанавливаем контекст (предыдущие инструменты GDI)
pDC->RestoreDC(-l);
}