Пиши Дома Нужные Работы

Обратная связь

Добавление обработчиков сообщений и событий в однодокументном приложении

Осуществляется автоматически. Чтобы добавить обработчик сообщения, во вкладке классы выделяем требуемый класс, нажимаем правую клавишу мыши, выбираем элемент меню Properties (Свойства) и далее открываем вкладку Messages (Сообщения), выбираем тип сообщения и добавляем функцию обработчик.

Добавить обработчик события, например, «Выбор элемента меню»:

В ресурсах выделяем элемент меню, нажимаем правую клавишу мыши, выбираем в меню элемент Add Event Handler, появляется окно для задания параметров функции обработчика события, в котором задаем параметры и добавляем функцию обработчик.

Вывод графики и перерисовка

Вывод графики желательно выполнять внутри класса «Представление» (внутри функций обработчиков этого класса).

Необходимо использовать классы контекстов устройств: CClientDC, CWindowDC.

Для перерисовки добавить код в метод

void CMyProectView::OnDraw(CDC* pDC)

класса представления после комментария

// TODO: add draw code for native data here

Задачи и порядок выполнения работы

Условие задачи:

Разработать приложение с меню, в котором содержится несколько элементов (минимум 2). Название элементов соответствуют геометрическим фигурам (например, «круг», «квадрат», …). При выборе элемента меню в окне рисуется соответствующая геометрическая фигура, граница пунктирная синего цвета, закраска красными вертикальными линиями. Обеспечить перерисовку выведенных фигур, например, при сворачивании-разворачивании окна. Обеспечить ввод строки текста с клавиатуры и рисование помощью «мыши» графического примитива в соответствии с вариантом задания, обеспечить перерисовку введенных элементов. Графический примитив – отрезок, начальная точка – точка положения курсора мыши в момент нажатия левой клавиши, рисование происходит при перемещении мыши с нажатой левой клавишей, конечная точка- положение курсора в момент отпускания клавиши. Для рисования отрезков использовать сплошное красное «перо». Возможный внешний вид окна приложения представлен на рисунке 6.



Рисунок 6 – Внешний окна приложения

Пример выполнения работы

В работе рекомендуется создать стандартное приложение MFC Application по шаблону MFC, окно для создания проекта представлено на рисунке 7. В свойствах проекта необходимо задать тип приложения «Один документ» (Single document), вид окна со свойствами проекта представлен на рисунке 8. Для упрощения интерфейса рекомендуется для параметра «Стиль проекта» установить значение «Стандарт MFC» или «Проводник Windows», см. рисунок 8. Все остальные параметры при создании проекта можно оставить без изменений (значения по умолчанию).

Для хранения данных внутри приложения задать необходимые поля в класс «Документ», вывод графики осуществлять через методы класса «Представление».

Рисунок 7 – Окно для создания проекта

Рисунок 8 – Внешний вид окна со свойствами проекта

Фрагменты исходного кода, которые необходимо добавить в однодокументное приложение.

Отрезки будем хранить в оперативной памяти в виде линейного односвязного списка, для этого создадим новый класс для задания отрезка (линии) как элемента списка. Исходные коды класса:

// MyLine.h: interface for the MyLine class.

//

//////////////////////////////////////////////////////////////////////

 

#if !defined(AFX_MYLINE_H__65C81C1E_6FED_4C5E_8888_7132A02976AB__INCLUDED_)

#define AFX_MYLINE_H__65C81C1E_6FED_4C5E_8888_7132A02976AB__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class MyLine: public CObject

{

public:

void add(MyLine *&pF); // Добавить элемент в начало списка

MyLine();

MyLine(CPoint p1, CPoint p2);

virtual ~MyLine();

CPoint p1, p2; // Координаты концов отрезка

MyLine *pNext; // Указатель на следующий элемент

static int Num; // Счетчик созданных объектов

DECLARE_SERIAL(MyLine)

};

#endif // !defined(AFX_MYLINE_H__65C81C1E_6FED_4C5E_8888_7132A02976AB__INCLUDED_)

 

// MyLine.cpp: implementation of the MyLine class.

//

//////////////////////////////////////////////////////////////////////

 

#include "stdafx.h"

#include "MyLine1.h"

#include "MyLine.h"

 

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

 

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

IMPLEMENT_SERIAL(MyLine, CObject, 1)

int MyLine::Num=0;

MyLine::MyLine()

{

Num++;

 

}

 

MyLine::~MyLine()

{

Num--;

 

}

 

MyLine::MyLine(CPoint p1, CPoint p2)

{

this->p1=p1;

this->p2=p2;

Num++;

}

 

void MyLine::add(MyLine *& pF)

{

pNext=pF;

pF=this;

}

 

В класс документа включаем данные:

// Attributes

public:

MyLine *pF; // Указатель на первый элемент списка линий

bool flagFig1, flagFig2; // Флаги, что геометрические фигуры нарисованы

CString text; // Строка текта, которая выводится

В начало файла описания документа добавляем:

#include "MyLine.h"

Конструктор класса документа имеет вид:

CMyLine1Doc::CMyLine1Doc()

{

// TODO: add one-time construction code here

pF=0;

flagFig1=flagFig2=false; // Фигуры не нарисованы

text=""; // Строка текcта пустая

}

В описание класса «Представление» добавляем поля:

CPoint p1, p2; // Точки, задающие рисуемый отрезок

CPen pen1; // Перо для рисования фигур через меню

CBrush brush1; // Кисть для рисования фигур через меню

В конструктор класса «Представление» добавляем код:

CMyLine1View::CMyLine1View()

{

// TODO: Создаем перо и кисть для рисования фигур через меню

pen1.CreatePen(PS_DASH, 1, RGB(0, 0, 255)); // Создаем синее пунктирное перо

brush1.CreateHatchBrush(HS_VERTICAL, RGB(255, 0, 0)); // Создаем красную

// кисть вертикальными линиями

}

В класс представления добавляем обработчики событий и сообщений: нажатие левой клавиши мыши; перемещение мыши; отпускание левой клавиши мыши; выбор элемента меню с именем «Квадрат»; выбор элемента меню с именем «Круг»; ввод символа. Следует отметить, что обработчики добавляются в автоматизированном режиме. Например, для добавления обработчика сообщения «Нажатие левой клавиши мыши» в класс представление необходимо выполнить следующее: в окне классов выделяем класс представление, в окне «Свойства» открываем вкладку «Сообщения», в списке сообщений выбираем сообщение с идентификатором WM_LBUTTONDOWN, активизируем этот элемент, в класс будет добавлен обработчик сообщения. Данная последовательность действий представлена на рисунке 9.

 

Рисунок 9 – Добавление в класс обработчика сообщения

Сообщение «ввод символа» добавляется в класс аналогично, только в списке сообщений выбираем сообщение с идентификатором WM_CHAR.

Для обработки события «Выбор элемента меню» необходимо выполнить следующее: открываем меню в файле ресурсов, выделяем необходимый элемент меню и нажимаем правую клавишу мыши, появляется контекстное меню, в котором выбираем элемент «Добавить обработчик событий…», появляется диалоговое окно, представленное на рисунке 10. В нем необходимо задать класс, куда добавляется обработчик (класс представление), и нажать кнопку «Добавить/править», открывается добавленный обработчик для редактирования.

 

Рисунок 10 – Пример окна для добавления обработчика события

Исходные коды обработчиков:

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

{

// TODO: Add your message handler code here and/or call default

p1=p2=point;

 

CView::OnLButtonDown(nFlags, point);

}

 

void CMyLine1View::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if (nFlags== MK_LBUTTON) // Нажата левая кнопка мыши

{

CPen pen1, pen2;

pen1.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));

pen2.CreateStockObject(WHITE_PEN);

CClientDC d(this);

d.SelectObject(&pen2);

d.MoveTo(p1); d.LineTo(p2); // Стирание старой линии

p2=point;

d.SelectObject(&pen1);

d.MoveTo(p1); d.LineTo(p2); // Рисование новой линии

}

 

CView::OnMouseMove(nFlags, point);

}

 

void CMyLine1View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

MyLine *p=new MyLine(p1, p2); // Создаем объект - линия

CMyLine1Doc* pDoc = GetDocument(); // Указатель объект - Документ

p->add(pDoc->pF); // Добавляем объект в список

pDoc->SetModifiedFlag(1); // Документ изменен

 

CView::OnLButtonUp(nFlags, point);

}

 

 

void CMyLine1View::On32771()

{

// TODO: Рисуем квадрат

CClientDC dc(this); // Создаем объект - Контекст устройства

dc.SelectObject(&pen1); // Загружаем перо

dc.SelectObject(&brush1); // Загружаем кисть

dc.Rectangle(100, 100, 200, 200); // Рисуем квадрат

CMyLine1Doc* pDoc = GetDocument(); // Указатель объект - Документ

pDoc->flagFig1=true; // Флаг, что фигура нарисована

}

 

 

void CMyLine1View::On32772()

{

// TODO: Рисуем круг

CClientDC dc(this); // Создаем объект - Контекст устройства

dc.SelectObject(&pen1); // Загружаем перо

dc.SelectObject(&brush1); // Загружаем кисть

dc.Ellipse(300, 100, 400, 200); // Рисуем круг

CMyLine1Doc* pDoc = GetDocument(); // Указатель объект - Документ

pDoc->flagFig2=true; // Флаг, что фигура нарисована

}

 

 

void CMyLine1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Обработчик сообщения - ввод символа

CMyLine1Doc* pDoc = GetDocument(); // Указатель объект - Документ

pDoc->text+=(TCHAR)nChar; // Дописываем символ к строке текста

CClientDC dc(this); // Создаем объект - Контекст устройства

dc.TextOut(50, 50, pDoc->text); // Выводим строку текста в контекст устройства

 

CView::OnChar(nChar, nRepCnt, nFlags);

}

 

Добавляем код в метод класса «Представление» для перерисовки:

void CMyLine1View::OnDraw(CDC* pDC)

{

CMyLine1Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); // Перо для рисования линий

pDC->SelectObject(pen); // Загружаем перо в контекст устройства

MyLine *p=pDoc->pF; // Указатель указывает на первый элемент списка

while(p) // Просматриваем список и рисуем линии

{

pDC->MoveTo(p->p1);

pDC->LineTo(p->p2);

p=p->pNext;

}

// Перерисовка строки текста

pDC->TextOut(50, 50, pDoc->text); // Выводим строку текста в контекст устройства

 

if (pDoc->flagFig1) // Если фигура была нарисована

{

pDC->SelectObject(&pen1); // Загружаем перо

pDC->SelectObject(&brush1); // Загружаем кисть

pDC->Rectangle(100, 100, 200, 200); // Рисуем круг

}

 

if (pDoc->flagFig2) // Если фигура была нарисована

{

pDC->SelectObject(&pen1); // Загружаем перо

pDC->SelectObject(&brush1); // Загружаем кисть

pDC->Ellipse(300, 100, 400, 200); // Рисуем круг

}

 

}






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2024 pdnr.ru Все права принадлежат авторам размещенных материалов.