Лабораторная работа № 6. Объектно-ориентированный подход при работе с графическими примитивами



 

Цель: получить навыки работы с механизмом наследования

 

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

Механизм наследования является одним из основополагающих принципов ООП, который позволяет уменьшить размер разрабатываемого кода. Базовый класс содержит методы и поля общие для производных классов. Создание нового класса на базе существующего позволяет получить всю его функциональность.

Рассмотрим механизм наследования на примере задачи рисования графических элементов: линии, кривой, окружности и прямоугольника. Данные объекты обладают схожими чертами, например, свойством «цвет пера» и  метод «нарисовать себя» Draw().

Поэтому при разработке программы целесообразно выделить базовый класс CElement и производные классы, которые определяют индивидуальные особенности каждого элемента. Иерархия классов представлена на рисунке 6.1.

Рисунок 6.1 –Иерархия классов

 

Возможный вид класса CElement представлен ниже:

class CElement : public CObject

{

        DECLARE_SERIAL(CElement)

protected:

  int m_PenWidth;//толщина пера

  COLORREF m_Color; //цвет пера

  CRect m_EnclosingRect; //описывающий прямоугольник

  CElement();

public:

  virtual ~CElement();

  virtual void Draw(CDC* pDC,CElement* pElement=nullptr); //виртуальный метод прорисовки элемента

  CRect GetBoundRect(void) const; //определение ограничивающего прямоугольника с учетом толщины пера

  virtual void Move(const CSize& aSize);

  virtual void Serialize(CArchive& ar);

};

Особый интерес представляют методы с ключевым словом virtial. Виртуальный означает видимый, но не существующий в реальности. Виртуальный метод переопределяется у наследников. Рассмотрим пример.

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

CElement* pShapes[100];

Для того чтобы нарисовать все фигуры достаточно написать следующий код:

for (in i=0;i<N;i++)

  pShapes[i]->Draw();

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

При компиляции программы компилятор не знает, чей метод он должен вызвать для прорисовки фигуры. Данное решение откладывается до запуска программы. При выполнении же программы станет известно адрес какого объекта хранится в указателе и какой метод нужно вызвать. Такой подход называется поздним связыванием.

Позднее связывание требует больше ресурсов, но дает выигрыш в возможностях и гибкости[5].

 

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

 

Продолжить программу из работы №5. Измененная программа должна позволять рисовать графические фигуры согласно своему варианту из работы 4.  Рисование производится мышью:

- нажатие ЛК мыши на клиентской области инициируется процесс рисования геометрической фигуры;

- перемещение мыши с удержанием ЛК мыши приводит к изменению размера фигуры;

- отпускание ЛК мыши приводит к фиксированию объекта.

 

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

 

1. Откройте проект из работы 5. Удалите написанный ранее код из метода OnDraw объекта представления.

2. Выделите приложение mfc2 в окне классов и нажатием ПК мыши вызовите контекстное меню. В меню выберите пункт «Добавить|Класс». В появившемся окне выберите шаблон «Класс MFC». Нажмите кнопку «Добавить».

Рисунок 6.2 –Выбор шаблона класса

 

3. Введите имя класса CElement, а в качестве базового класса выберите CObject. Остальные параметры оставьте по умолчанию. В результате появится следующий класс, который описан в файле Element.h, а реализация методов – в Element.cpp:

#pragma once // CElement

class CElement : public CObject

{

  DECLARE_DYNAMIC(CElement)

 

public:

  CElement();

  virtual ~CElement();

 

protected:

  DECLARE_MESSAGE_MAP()

};

4. Класс CElement содержит переменные и функции, общие для всех производных классов, и виртуальные функции, которые заменяются в производных классах. Произведем изменения класса CElem е nt следующим образом:

class CElement : public CObject

{

  DECLARE_DYNAMIC(CElement)

protected:

  int m_PenWidth;//толщина пера

COLORREF m_Color;//цвет пера


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

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






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