Лабораторная работа № 5. Основы векторной графики в        приложениях MFC



 

Цель: изучить команды по рисованию основных графических элементов

 

Теоретическая часть

 

Операционная система Windows требует, чтобы вывод графической информации осуществлялась через интерфейс графических устройств (Graphical Device Interface -GDI). Интерфейс GDI позволяет рисовать, не задумываясь, на каком устройстве будет отображаться рисунок. Интерфейс GDI поддерживают все мониторы, а также принтеры и плоттеры[5].

При выводе изображения на устройство графического вывода (например, экран) используется контекст устройства. Контекст устройства – это структура данных, определенная ОС Windows и содержащая информацию, которая позволяет преобразовать запросы на вывод, поступающие форме независимых вызовов функций GDI, в действия физического вывода конкретного устройства.

С помощью функций GDI можно изменять параметры, которые влияют на вывод в контекст устройства, например, цвет рисования, цвет фона, толщину линии, используемой при рисовании.

В разработанном в предыдущей работе проекте мастер приложений MFC создал класс представления Cmfc2 View, который содержит виртуальный метод OnDraw(). Данный метод вызывается всегда, когда клиентская область должна быть перерисована.

void Cmfc2View::OnDraw(CDC* pDC)

{

  // TODO: добавьте специализированный код или вызов базового класса

  Cmfc2Doc* pDoc=GetDocument();

  ASSERT_VALID(pDoc);

  if (!pDoc)

        return;

}

Для добавления функции OnDraw() выберите класс представления С mfc2 View и вызовите контекстное меню, в котором выберите «Мастер классов». В появившемся окне выберите вкладку «Виртуальные функции» и добавьте метод OnDraw().

Указатель pDC является указателем на контекст устройства рисования. Переменная pDoc  является указателем на объект класса документ.

При рисовании в клиентской области необходимо знать, сто точка отсчета находится в левой верхней точке. На рисунке 5.1 представлена схема направления осей и точки отсчета по умолчанию.

Рисунок 5.1 - Схема расположения осей координатной системы

 

В контексте устройства графические сущности рисуются относительно текущей позиции. Текущая позиция – это точка в клиентской области, которая была установлена ранее, после рисования предыдущей фигуры или установлена явным образом вызовом соответствующей функции MoveTo(). Ниже приведен пример установки начальной позиции:

void Cmfc2View::OnDraw(CDC* pDC)

{

  // TODO: добавьте специализированный код или вызов базового класса

  Cmfc2Doc* pDoc=GetDocument();

  ASSERT_VALID(pDoc);

  if (!pDoc)

        return;

  pDC->MoveTo(50,50);

 

}

Существует две версии функции MoveTo:

CPoint MoveTo(int x,int y);

CPoint MoveTo(POINT aPoint);

 

Тип POINT представляет собой структуру:

Typedef struct tagPOINT

{

LONG x;

LONG y;

}

Для рисования линии используется функция LineTo(), которая рисует от текущей позиции в точку, указанную в аргументе. Функция имеет две версии:

BOOL LineTo(int x,int y);

BOOL LineTo(POINT aPoint);

После выполнения функции LineTо() текущей позицией становится конец линии.

Рисование окружностей.

Для рисования окружности можно воспользоваться функцией Ellipse(). Окружность является замкнутой фигурой, которая заполняется установленным цветом. Внутренний цвет определяется кистью (brush), выбранной в контексте устройства. Формат функции приведены ниже:

BOOL Ellipse(int x1,int y1, int x2,int y2);

BOOL Ellipse (LPCRECT lpRect);

 

Функция Ellipse() рисует эллипс, вписанный в прямоугольник, заданный координатами x1, y1, x2 и y2. Во втором случае для задания координат прямоугольника используется указатель на объект класса CRect, который содержит следующие поля: left, top, right и bottom.

Для рисования прямоугольника используется функция Rectangle(). Параметры функции аналогичны Ellipse().

Рисование в цвете.

При рисовании подразумевается, что используется перо (pen), которое определяет толщину и цвет линии. Обычно по умолчанию используется перо черного цвета. Для изменения цвета рисуемых линий нужно создать новый объект класса CPen с заданными параметрами.

Ниже приведен программный код создания пера :

CPen aPen;

  aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));

Метод CreatePen имеет следующую структуру:

   HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);

где fnPenStyle – стиль пера;

  nWidth –определяет толщину пера;

   crColor - цвет пера.

В результате создается перо, которое рисует сплошной линией красного цвета с толщиной 2.

Чтобы воспользоваться пером, его нужно выбрать в контексте устройства, в котором выполняется рисование.

Ниже представлен код с примером рисования линии с параметрами нового пера:

CPen aPen;

  aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));

  CPen* pOldPen=pDC->SelectObject(&aPen);

  pDC->MoveTo(50,50);

  pDC->LineTo(150,150);

  pDC->SelectObject(pOldPen);

Метод контекста устройства SelectObject устанавливает новое перо и сохраняет адрес старого. После использования нового пера рекомендуется восстановить старок перо.

Параметры заполнения замкнутых фигур определяется объектом класса CBrush. Для установки параметров кисти используются методы:

BOOL CBrush::CreateSolidBrush(COLORREF crColor);

BOOL CBrush:: CreateHatchBrush ( int nIndex, COLORREF crColor);

 

где crColor – цвет кисти;

    nIndex - определяет один из возможных вариантов штриховки.

Пример использования пера приведен ниже:

CBrush aBrush;

  aBrush.CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));

  CBrush* pOldBrush=pDC->SelectObject(&aBrush);

  pDC->Rectangle(30,30,200,200);

  pDC->SelectObject(pOldBrush);

 

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

Постановка задачи

 

Написать программу, которая рисует элементы с различными цветами. Для замкнутых фигур использовать различные виды штриховки.

 

Порядок выполнения работы

1. Создайте новый проект в среде Visual C++ на базе шаблона однодокументного приложения MFC;

2. Выберите класс представления и его метод OnDraw();

3. В метод OnDraw() добавьте код позволяющий рисовать элементы, указанные в пункте 5.2.;

4. Проверьте правильность работы программы и составьте отчет по работе;

5. Ответьте на контрольные вопросы.

 

Контрольные вопросы

1. Когда вызывается метод OnDraw() класса представления MFC?

2. Где будет находиться текущая точка после выполнения команды LineTo?

3. Каким объектом определяется параметры рисуемых линий?

4. Для каких фигур имеет значение объект кисть?

5. Для чего после рисования рекомендуется восстанавливать старое перо?

 


Дата добавления: 2019-09-13; просмотров: 513; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!