
- •Содержание
- •Введение
- •Лабораторная работа №1 разработка программы на базе каркаса приложений
- •Лабораторная работа №2 создание остова приложения
- •Лабораторная работа №3 создание приложения с диалоговым интерфейсом.
- •Лабораторная работа №4 создание приложений с одно-документным интерфейсом
- •Лабораторная работа № 5 создание приложения с многодокументным интерфейсом.
- •Лабораторная работа № 6 создание приложений для построения графических изображений
- •Лабораторная работа № 7 создание приложений баз данных
- •Лабораторная работа № 8 создание приложений для работы с файлами.
- •Лабораторная работа № 9 создание справочной системы для приложения под windows
- •Лабораторная работа № 10 создание многопоточных приложений.
- •Список литературы.
Лабораторная работа № 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. Создать приложение, в окне которого при запуске вычерчивается эллипс, выполнив следующие действия:
Создать остов приложения с одно-документным интерфейсом, задав для проекта имя Ellipse и выбрав для него необходимый рабочий каталог.
В остов метода OnDraw остова класса CEllipseView, реализация методов которого определяется в файле EllipseView.срр, вставить оператор рисования эллипса:
void CEllipseView::OnDraw(CDC* pDC)
{
CEllipseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Ellipse(20,20,150,200);
}
Скомпилировать проект и проверить работу приложения, учитывая что объект С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, выполнив следующие действия:
Создать остов приложения с одно-документным интерфейсом, задав для проекта имя Ellipse и выбрав для него необходимый рабочий каталог.
В файле EllipseDoc.h доопределить класс СEllipseDoc:
//Attributes
public:
CRect m_rectEllipse; //-прямоугольник для эллипса;
…………………………………………………………….
//Operations
public:
CRect EllipseDisc() {return m_rectEllipse;}
В файле EllipseDoc.cpp доопределить метод OnNewDocument:
BOOL CEllipseDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
m_rectEllipse=CRect(20,20,200,100); //-начальное значение;
return TRUE;
}
Переопределить метод OnDraw в файле CEllipseView.cpp:
void CEllipseView::OnDraw(CDC* pDC)
{
CEllipseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Ellipse(pDoc->EllipseDisc());
}
Добавить в меню Edit элемент Increase Ellipse с помощью редактора ресурсов.
С помощью мастера ClassWizard создать остов метода OnEditIncreaseEllipse обработчики сообщения COMMAND от нового элемента меню и дополнить его необходимыми операторами:
void CEllipseDoc::OnEditIncreaseEllipse()
{ m_rectEllipse+=CRect(0,0,10,10); //-увеличение размеров;
UpdateAllViews(NULL); //-посылка сообщения Update облику
// для выработки сообщения OnDraw.
}
Скомпилировать проект и проверить работу приложения, учитывая что объект класса CЕllipseView получает сообщение OnDraw в момент создания окна, а также всякий раз при изменении размеров эллипса.
Задание №4. Создать приложение, демонстрирующее применение следующих методов класса CWnd:
GetUpdateRect; GetUpdateRgn;
Invalidate; InvalidateRect; InvalidateRgn;
ValidateRect; ValidateRgn.
Контрольные вопросы:
Назвать основные функции GDI системы Windows.
Чем отличается контекст устройства системы Windows и контекст устройства библиотеки MFC Visual C++.
Перечислить методы и атрибуты класса CDC.
Назвать и охарактеризовать производные классы класса CDC библиотеки MFC.
Каким образом создается и используется контекст устройства при перерисовке окна?
Подробнее описать реализацию метода OnDraw класса CDC.
Как переопределить метод OnDraw для того, чтобы нарисовать в окне фигуру прямоугольника, эллипса, сектора эллипса, замкнутого многоугольника и составного замкнутого многоугольника, а также выдать пиксел, провести линию и напечатать текст?
Указать события, которые приводят к передаче сообщения OnDraw.
Объяснить, каким образом возникает сообщение OnDraw при изменение размеров эллипса в третьем задании.
Объяснить назначение документа и переменной m_rectEllipse в третьем задании.
Что такое поврежденная клиентская область, область окна и прямоугольник окна? Как и когда они определяются?
Перечислить и объяснить назначения методы для обработки поврежденных частей рабочего окна приложения.
Перечислить основные атрибуты контекста устройства.
Сколько типов логических систем координат поддерживает Windows?
Написать формулы для преобразования логических координат в физические координаты устройства.
Перечислить все объекты GDI и указать случаи их применения.
Описать порядок использования объектов GDI.