Лабораторная работа № 10-11. СОЗДАНИЕ ПРИЛОЖЕНИЙ ДЛЯ ПОСТРОЕНИЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ

Цель работы - овладение инструментальными средствами и методами разработки графических объектно-ориентированных приложений в студии разработчика 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, реализация методов которого определяется в файле Ellipse View. срр, вставить оператор рисования эллипса:

void CEllipseView ::OnDraw(CDC* pDC)

{

CEllipseDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

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

}

3. Скомпилировать проект и проверить работу приложения, учитывая что объект С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 y 1, 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 y 1, 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; //-прямоугольник для эллипса;

Лабораторная работа № 10-11. СОЗДАНИЕ ПРИЛОЖЕНИЙ ДЛЯ ПОСТРОЕНИЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ - student2.ru //Operations public:

CRect EllipseDisc() {return m_rectEllipse;}

3. В файле EllipseDoc.cpp доопределить метод OnNewDocument: BOOL CEllipseDoc: :OnNewDocument()

if (! CDocument:: OnNewDocument())

return FALSE;

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

}

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

void CEllipseView::OnDraw(CDC* pDC)

{

CEllipseDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

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

}

Құрбан Е. Н.

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

С помощью мастера ClassWizard создать остов метода OnEditIncreaseEllipse обработчики сообщения COMMAND от нового элемента меню и дополнить его необходимыми onepar>EpaMH:void CEllipseDoc: :OnEditIncreaseEllipse() {m_rectEllipse+=CRect(0,0,10,10); //-увеличение размеров;UpdateAllViews(NULL); //-посылка сообщения Update облику // для выработки сообщения OnDraw.}Скомпилировать проект и проверить работу приложения, учитывая что объект класса CЕllipseView получает сообщение OnDraw в момент создания окна, а также всякий раз при изменении размеров эллипса.Задание №4. Создать приложение, демонстрирующее применение следующих методов класса CWnd:GetUpdateRect; GetUpdateRn;

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.

Наши рекомендации