Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений на Visual C++ с использов...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
375.81 Кб
Скачать

Лабораторная работа № 6 создание приложений для построения графических изображений

Цель работы – овладение инструментальными средствами и методами разработки графических объектно-ориентированных приложений в студии разработчика Visual C++.

Работа с графическими устройствами в Visual C++, как и в системе Windows является аппаратно-независимой. Это означает, что при программировании графических приложений средств для прямого доступа к аппаратуре нет. Всё взаимодействие с ней производится через методы специальных классов библиотеки MFC, использующих функции GDI системы Windows. Благодаря этому вывод рисунка на экран или на принтер реализуется практически одинаково. Это достигается тем, что в функциях вывода указывается не конкретное устройства, а абстрактный объект - контекст устройства, содержащий все необходимые параметры вывода и отображаемый средствами Windows на конкретное устройство вывода.

В Visual C++ контекст устройства является объектом CDC (Class of Device Context) или какого-либо производного от CDC класса. Класс CDC инкапсулирует все методы для построения изображения и вывода текста в окно, а также целый ряд параметров графических устройств вывода, называемых атрибутами контекста устройства, его атрибуты устанавливаются по умолчанию, и в дальнейшем могут быть изменены специальными методами класса CDC.

Программист обычно не заботится о создании и уничтожении объекта класса CDC, так как обработчик сообщения OnDraw, обеспечивающий перерисовку окна, имеет указатель на контекст устройства, переданный как параметр сообщения OnDraw. Объект-облик класса CView получает это сообщение, когда требуется перерисовать содержимое окна, связанного с этим обликом.

Задание №1. Создать приложение, в окне которого при запуске вычерчивается эллипс, выполнив следующие действия:

  1. Создать остов приложения с одно-документным интерфейсом, задав для проекта имя Ellipse и выбрав для него необходимый рабочий каталог.

  2. В остов метода OnDraw остова класса CEllipseView, реализация методов которого определяется в файле EllipseView.срр, вставить оператор рисования эллипса:

void CEllipseView::OnDraw(CDC* pDC)

{

CEllipseDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->Ellipse(20,20,150,200);

}

  1. Скомпилировать проект и проверить работу приложения, учитывая что объект СEllipseView получает сообщение OnDraw в момент создания окна, а также всякий раз при повреждении окна.

Задание №2. Создать приложение, которое в рабочем окне строит координатную сетку, а затем в ячейках этой сетки строит геометрические фигуры из следующего набора: прямоугольник, эллипс, скругленный прямоугольник, сегмент эллипса, сектор эллипса, замкнутый многоугольник, составной замкнутый многоугольник. Для выполнения задания использовать следующие методы класса CDC:

COLORREF GetPixel(int x, int y) const;

COLORREF GetPixel(POINT point) const;

COLORREF SetPixel(int x, int y, COLORREF crColor);

COLORREF SetPixel(POINT point, COLORREF crColor);

virtual CGdiObject* SelectStockObject(int nIndex);

CPen* SelectObject(CPen* pPen);

CBrush* SelectObject(CBrush* pBrush);

CGdiObject* SelectObject(CGdiObject* pObject);

BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3,int x4, int y4);

BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd);

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

BOOL Ellipse(LPCRECT lpRect);

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

BOOL Rectangle(LPCRECT lpRect);

BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3);

BOOL RoundRect(LPCRECT lpRect, POINT point);

CPoint MoveTo(int x, int y);

CPoint MoveTo(POINT point);

BOOL LineTo(int x, int y);

BOOL LineTo(POINT point);

Задание №3. Создать приложение, обеспечивающее изменение размеров эллипса с помощью команды меню Increase Ellipse, выполнив следующие действия:

  1. Создать остов приложения с одно-документным интерфейсом, задав для проекта имя Ellipse и выбрав для него необходимый рабочий каталог.

  2. В файле EllipseDoc.h доопределить класс СEllipseDoc:

//Attributes

public:

CRect m_rectEllipse; //-прямоугольник для эллипса;

…………………………………………………………….

//Operations

public:

CRect EllipseDisc() {return m_rectEllipse;}

  1. В файле EllipseDoc.cpp доопределить метод OnNewDocument:

BOOL CEllipseDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

m_rectEllipse=CRect(20,20,200,100); //-начальное значение;

return TRUE;

}

  1. Переопределить метод OnDraw в файле CEllipseView.cpp:

void CEllipseView::OnDraw(CDC* pDC)

{

CEllipseDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->Ellipse(pDoc->EllipseDisc());

}

  1. Добавить в меню Edit элемент Increase Ellipse с помощью редактора ресурсов.

  2. С помощью мастера ClassWizard создать остов метода OnEditIncreaseEllipse обработчики сообщения COMMAND от нового элемента меню и дополнить его необходимыми операторами:

void CEllipseDoc::OnEditIncreaseEllipse()

{ m_rectEllipse+=CRect(0,0,10,10); //-увеличение размеров;

UpdateAllViews(NULL); //-посылка сообщения Update облику

// для выработки сообщения OnDraw.

}

  1. Скомпилировать проект и проверить работу приложения, учитывая что объект класса CЕllipseView получает сообщение OnDraw в момент создания окна, а также всякий раз при изменении размеров эллипса.

Задание №4. Создать приложение, демонстрирующее применение следующих методов класса CWnd:

GetUpdateRect; GetUpdateRgn;

Invalidate; InvalidateRect; InvalidateRgn;

ValidateRect; ValidateRgn.

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

  1. Назвать основные функции GDI системы Windows.

  2. Чем отличается контекст устройства системы Windows и контекст устройства библиотеки MFC Visual C++.

  3. Перечислить методы и атрибуты класса CDC.

  4. Назвать и охарактеризовать производные классы класса CDC библиотеки MFC.

  5. Каким образом создается и используется контекст устройства при перерисовке окна?

  6. Подробнее описать реализацию метода OnDraw класса CDC.

  7. Как переопределить метод OnDraw для того, чтобы нарисовать в окне фигуру прямоугольника, эллипса, сектора эллипса, замкнутого многоугольника и составного замкнутого многоугольника, а также выдать пиксел, провести линию и напечатать текст?

  8. Указать события, которые приводят к передаче сообщения OnDraw.

  9. Объяснить, каким образом возникает сообщение OnDraw при изменение размеров эллипса в третьем задании.

  10. Объяснить назначение документа и переменной m_rectEllipse в третьем задании.

  11. Что такое поврежденная клиентская область, область окна и прямоугольник окна? Как и когда они определяются?

  12. Перечислить и объяснить назначения методы для обработки поврежденных частей рабочего окна приложения.

  13. Перечислить основные атрибуты контекста устройства.

  14. Сколько типов логических систем координат поддерживает Windows?

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

  16. Перечислить все объекты GDI и указать случаи их применения.

  17. Описать порядок использования объектов GDI.