Лабораторная работа № 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; //-прямоугольник для эллипса;
//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.