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.
Задание для самостоятельной работы.
Создайте визуальное приложение, позволяющее рисовать графические примитивы (линию, круг, прямоугольник), сохранять и восстанавливать изображение.