Сейчас важно понять следующее. Пример моделирует
ситуацию, когда мы имеем реальные
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);
} |