Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по лабам по ООПиП.pdf
Скачиваний:
219
Добавлен:
15.09.2014
Размер:
1.77 Mб
Скачать

38

Лабораторная работа № 6.

Архитектура «Модель-Вид-Контроллер».

Цель работы:

4.Изучить архитектурную модель Модель-Вид-Контроллер.

5.Разработать классы модели, вида и контроллера.

6.Изучить обработку событий мыши и клавиатуры

Создание простейшего оконного приложения на базе MFC

16.Запустите Visual Studio.

17.Выберите пункт меню File->New->Project->Visual C++->MFC. В каче-

стве названия проекта введите Ring.

18.Откроется мастер генерации проекта MFC, в котором последовательно переходя по вкладкам следует выбрать тип приложения (Single Document), поддержку архитектуры Документ-Вид (Document/View).

19.Остальные пункты можно оставить без изменения. В качестве базового класса для RingView выберите CScrollView (окно с прокруткой).

20.Нажмите F5 для запуска приложения. Появится базовое окно приложения (рис. 1)

Рисунок 1- Окно приложения, сгенерированное по умолчанию. 21.При появлении формы на экране, нажмите на кнопку закрытия формы

для возвращения в Visual Studio.

39

Добавление содержимого в документ

1.Выберите в окне браузера файл RingDoc.h.

2.Добавьте в него следующий код:

typedef CArray<CPoint> PointArray; typedef CArray<COLORREF> ColorArray;

static const COLORREF WHITE = RGB(255, 255, 255); static const COLORREF GREY = RGB(128, 128, 128); static const COLORREF BLACK = RGB(0, 0, 0);

Этот код добавляется перед объявлением class CRingDoc : public CDocument

и объявляет два массива – массив точек, соответствующих объекту CPoint (точка) и массив цветов (три цвета).

3. Добавьте к классу два частных (private) атрибута: private:

PointArray m_pointArray;

ColorArray m_colorArray;

Эти атрибуты представляют объявленные ранее массивы.

Обработка сообщений мыши и клавиатуры

1.В окне баузера перейдите на вкладку Class View, выберите класс СRingView.

2.Нажмите правую кнопку мыши и откройте окно свойств класса СRingView (Properties).

3.Нажмите кнопку Сообщения (Messages). Чтобы добавить обработчик сообщений, следует выбрать тип обрабатываемых событий. Выберите обработчик для события WM_LBUTTONDOWN (рис. 2).

Рисунок 2 – Обработчик события WM_LBUTTONDOWN.

4.Заготовка кода обработчика автоматически генерируется системой. Как видно, обработчик в конце должен вызывать обработчик родительского класса.

40

5. Добавьте в код обработчика строки, передающие информацию о нажатии левой кнопки мыши в связанный документ.

void CRingView::OnLButtonDown(UINT nFlags, CPoint point)

{

CRingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->MouseDown(point); CScrollView::OnLButtonDown(nFlags, point);

}

6.Откройте файл RingDoc.h. В него следует добавить объявление функции MouseDown(), принимающей информацию о координатах мыши, а также функций, возвращающих массивы точек и цветов, хранящих-

ся в документе. public:

void MouseDown(CPoint point);

PointArray& GetPointArray() {return m_pointArray;} ColorArray& GetColorArray() {return m_colorArray;}

7. Откройте файл RingDoc.cpp. В него следует добавить код функции

MouseDown().

void CRingDoc::MouseDown(CPoint point)

{

m_pointArray.Add(point); m_colorArray.Add(WHITE); UpdateAllViews(NULL);

}

8. Аналогично добавляется обработчик сообщений клавиатуры WM_KEYDOWN. Код обработчика приведен ниже:

void CRingView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch (nChar)

{

case VK_UP:

OnVScroll(SB_LINEUP, 0, NULL); break; case VK_DOWN:

OnVScroll(SB_LINEDOWN, 0, NULL); break; case VK_PRIOR:

OnVScroll(SB_PAGEUP, 0, NULL); break; case VK_NEXT:

OnVScroll(SB_PAGEDOWN, 0, NULL); break; case VK_LEFT:

OnHScroll(SB_LINELEFT, 0, NULL); break; case VK_RIGHT:

OnHScroll(SB_LINERIGHT, 0, NULL); break; case VK_HOME:

OnHScroll(SB_LEFT, 0, NULL); break; case VK_END:

OnHScroll(SB_RIGHT, 0, NULL); break;

}

CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);

}

41

Вывод изображения

1.В окне браузера перейдите на вкладку Class View, выберите класс СRingView.

2.Найдите функцию вывода изображений OnDraw(CDC* pDC).

3.Вставьте в функцию следующий код:

PointArray& pointArray = pDoc->GetPointArray(); ColorArray& colorArray = pDoc->GetColorArray(); int iSize = (int) pointArray.GetSize();

for (int iIndex = 0; iIndex < iSize; ++iIndex)

{

CPoint point = pointArray[iIndex]; COLORREF color = colorArray[iIndex]; CPen pen(PS_SOLID, 0, BLACK); CBrush brush(color);

pDC->Ellipse(point.x - 100, point.y - 100, point.x + 100, point.y + 100);

CPen* pOldPen = pDC->SelectObject(&pen); CBrush* pOldBrush = pDC->SelectObject(&brush);

}

Установка координат

11.В окне браузера перейдите на вкладку Class View, выберите класс СRingView.

12.Найдите функцию начальной инициализации void CRingView::OnInitialUpdate().

13.Вставьте в нее следующий код:

CSize sizeLine(500, 500); CSize sizePage(5000, 5000); CSize sizeTotal(21600, 27900);

SetScrollSizes(MM_HIMETRIC, sizeTotal, sizePage, sizeLine);}

14.Этот код устанавливает размер области для рисования 216x297 мм, размер строки 5мм, размер страницы 50 мм.

15.Добавьте в код обработчика void CRingView::OnLButtonDown(UINT nFlags, CPoint point) строки, транслирующие координаты окна в координаты страницы:

void CRingView::OnLButtonDown(UINT nFlags, CPoint point)

{

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

CClientDC dc(this); OnPrepareDC(&dc); dc.DPtoLP(&point);

pDoc->MouseDown(point); CScrollView::OnLButtonDown(nFlags, point);

}

16.Нажмите F5 для запуска приложения.

42

17.При появлении формы на экране, нажмите несколько раз левую кнопку мыши в окне формы. Убедитесь, что изображение выводится на экране. Нажмите навигационные клавиши (стрелки), чтобы убедиться, что изображение в окне прокручивается (рис. 3).

Рисунок 3 – Результат работы программы. 18.Закройте форму для возвращения в Visual Studio.

Задание для самостоятельной работы.

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