Отчёт о лабораторной работе №2 «Разработка приложений с использованием библиотеки mfc» Преподаватель: Романенко С. А




Скачать 418.01 Kb.
НазваниеОтчёт о лабораторной работе №2 «Разработка приложений с использованием библиотеки mfc» Преподаватель: Романенко С. А
страница2/5
Дата публикации07.04.2013
Размер418.01 Kb.
ТипОтчет
odtdocs.ru > Военное дело > Отчет
1   2   3   4   5
^

Откомпилировать и выполнить пример Sketcher03


  1. Заменить контейнер MFC для хранения элементов на контейнер из л/р 1.

      • класс документа оснащен атрибутом

        // граф фигур документа

Graph<CElement>* _container;

      • для работы с ним созданы методы

        CElement* AddElement(CElement* m_pElement);

void SendToBack(CElement* pElement);

void DeleteElement(CElement* m_pSelected);

// получить новый итератор, указывающий на начало контейнера

Iterator<CElement>* getNewIterator() const { return _container->getIterator(); }

      • задание графа происходит следующим образом:

        • из представления документа мышью по отдельности задаются фигуры. Т.к. контейнер — это граф на базе списка ребер, и кроме ребер ничего в нем хранить нельзя, то в контейнер помещаются дуги, содержащие заданные вершины.

        • мышью задаются ребра — протягиванием связи от одной фигуры к другой. При этом существующие дуги с этими вершинами заменяются ребрами, содержащими вновь соединенные вершины.

        • код, отвечающий за это:

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

{

CClientDC aDC(this); // Create a device context

OnPrepareDC(&aDC); // Get origin adjusted

if (!m_MoveMode && GetDocument()->GetElementType()!=RIBBLE)

{

aDC.DPtoLP(&point); // convert point to Logical

}
if(m_MoveMode)

{

// In moving mode, so drop the element

m_MoveMode = FALSE; // Kill move mode

m_pSelected = 0; // De-select the element

GetDocument()->UpdateAllViews(0); // Redraw all the views

}

else

{

if (GetDocument()->GetElementType()==RIBBLE)

{ // добавляем ребро

CElement* currentSelection = SelectElement(point);

if (currentSelection != NULL)

{ // найдена начальная вершина

CPoint* exactCenter = &(currentSelection->GetBoundRect().CenterPoint());

m_FirstPoint = *exactCenter;

// запоминаем ее

m_pSelected = currentSelection;

SetCapture(); // Capture subsequent mouse messages

}

}

else

{

m_FirstPoint = point; // Record the cursor position

SetCapture(); // Capture subsequent mouse messages

}

}

}
void CSketcherView::OnLButtonUp(UINT nFlags, CPoint point)

{

if(this == GetCapture())

ReleaseCapture(); // Stop capturing mouse messages
// If there is an element, add it to the document

if(m_pTempElement)

{

CClientDC aDC(this);

OnPrepareDC(&aDC);
if (GetDocument()->GetElementType()==RIBBLE)

{ // соединяем ребрами

CElement* secondVertex = SelectElement(point);

if (secondVertex!=NULL)

{ // найдена конечная вершина

GetDocument()->linkElements(m_pSelected, secondVertex);

}

}

else

{ // добавляем новый элемент

GetDocument()->AddElement(m_pTempElement);

}
GetDocument()->UpdateAllViews(0,0,m_pTempElement); // Tell all the views

m_pTempElement = 0; // Reset the element pointer

}

}
void CSketcherView::OnMouseMove(UINT nFlags, CPoint point)

{

// Define a Device Context object for the view

CClientDC aDC(this);

OnPrepareDC(&aDC); // Get origin adjusted
if(m_MoveMode)

{ // передвигаем фигуру

aDC.DPtoLP(&point); // Convert to logical coordinatess

MoveElement(aDC, point); // Move the element

}

else if((nFlags & MK_LBUTTON) && (this == GetCapture()))

{ // рисуем фигуру

aDC.DPtoLP(&point);

m_SecondPoint = point; // Save the current cursor position
if(m_pTempElement)

{ // фигура есть

aDC.SetROP2(R2_NOTXORPEN); // Set drawing mode

m_pTempElement->Draw(&aDC);

m_pTempElement->resize(m_FirstPoint, m_SecondPoint);

}

else

{ // фигуры нет

m_pTempElement = CreateElement();

}

m_pTempElement->Draw(&aDC);

}

else

{ // ничего не двигаем и не рисуем, только подсвечиваем

CElement* pCurrentSelection = SelectElement(point);

markHighlighted(pCurrentSelection, aDC);

}

}



      1. Ознакомиться с механизмом отрисовки элементов.

      • отрисовка происходит в методе Draw класса CsketcherView. Для нашего контейнера определим ее так:

        void CSketcherView::OnDraw(CDC* pDC)

{

CSketcherDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CElement* pElement = NULL;

Iterator<CElement>* iter = pDoc->getNewIterator();
CPoint* start = NULL;

CPoint* end = NULL;
while (iter->hasNext())

{

Ribble<CElement>* ribble = iter->next();
pElement = ribble->get__vertex1();

if(pDC->RectVisible(pElement->GetBoundRect()))

{

pElement->Draw(pDC, m_pSelected, isGraphVisible);

start = &(pElement->GetBoundRect().CenterPoint());

}
pElement = ribble->get__vertex2();

if(pDC->RectVisible(pElement->GetBoundRect()))

{

pElement->Draw(pDC, m_pSelected, isGraphVisible);

end = &(pElement->GetBoundRect().CenterPoint());

}
drawRibble(ribble, pDC, GREEN);

}

}

      1. К существующему режиму рисования элементов добавить режим изменения позиции элементов (drag'n'drop).

      • оснастим программу контекстным меню, в котором для выбранного элемента можно будет задать режим перемещения


        Если элемент выбран, отображается это контекстное меню. Метод, отображающий его:

void CSketcherView::OnRButtonUp(UINT nFlags, CPoint point)

{

// Create the cursor menu

CMenu aMenu;

aMenu.LoadMenu(IDR_CURSOR_MENU); // Load the cursor menu

ClientToScreen(&point); // Convert to screen coordinates
// Display the pop-up at the cursor position

if(m_pSelected)

{

aMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,

point.x, point.y, this);

}

else

{

... // вызывается меню управления цветом

}

}

Чтобы этот код сработал, необходимо иметь указатель на элемент, над которым находится курсор m_pSelected. Этот указатель возвращает следующий метод:

CElement* CSketcherView::SelectElement(CPoint aPoint)

{

// Convert parameter aPoint to logical coordinates

CClientDC aDC(this);

OnPrepareDC(&aDC);

aDC.DPtoLP(&aPoint);
CSketcherDoc* pDoc=GetDocument(); // Get a pointer to the document

CElement* pElement = NULL; // Store an element pointer

CRect aRect(0,0,0,0); // Store a rectangle
Iterator<CElement>* iter = pDoc->getNewIterator();

while (iter->hasNext())

{

Ribble<CElement>* ribble = iter->next();
pElement = ribble->get__vertex1();

aRect = pElement->GetBoundRect();

if(aRect.PtInRect(aPoint))

return pElement;
pElement = ribble->get__vertex2();

aRect = pElement->GetBoundRect();

if(aRect.PtInRect(aPoint))

return pElement;

}
return NULL; // No element found

}

      • оснастим CsketcherView полем, которое будет показывать режим перемещения

        BOOL m_MoveMode; // Move element flag

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

        void CSketcherView::MoveElement(CClientDC& aDC, CPoint& point)

{

CSize Distance = point - m_CursorPos; // Get move distance

m_CursorPos = point; // Set current point as 1st for next time
// If there is an element, selected, move it

if(m_pSelected)

{

aDC.SetROP2(R2_NOTXORPEN);

m_pSelected->Draw(&aDC,m_pSelected,isGraphVisible); // Draw the element to erase it

m_pSelected->Move(Distance); // Now move the element

m_pSelected->Draw(&aDC,m_pSelected,isGraphVisible); // Draw the moved element

}

}

      1. Добавить в контекстное меню элементы, инициирующие запуск алгоритмов из л/р 1.

      • оснастим контекстное меню пунктами

        • «Удалить». Это вызовет алгоритм удаления вершины из графа.

        • «Отправить в конец контейнера». Это вызовет удаление вершины из графа и помещение ее в последнее ребро графа.
1   2   3   4   5

Похожие:

Отчёт о лабораторной работе №3 «Применение протоколов связи приложений...
На Visual Basic for Application написать макрос, который с помощью dde создает новую группу на рабочем столе и в ней новый программный...

Отчёт о лабораторной работе №4 «Разработка экспертной системы с использованием...
Провести создание нечеткой экспертной системы для определения размера чаевых. Провести проверку работы созданной системы

Отчёт о лабораторной работе №3 «Анализ операционных графовых моделей...
Для задачи обработки данных, рассматривавшейся в лабораторных работах 1-2, построить управляющий граф программы с нагруженными дугами,...

Отчет по лабораторной работе «проектирование печатного узла рэа»...
Целью лабораторной работы является разработка конструкторской документации узла рэа по заданной принципиальной схеме

Отчет по лабораторной работе «проектирование печатного узла рэа»...
Целью лабораторной работы является разработка конструкторской документации узла рэа по заданной принципиальной схеме

Отчёт о лабораторной работе №2 «Изучение понятия сопроцессов и виртуальных...
Написать программу, устанавливающую виртуальные связи между тремя сопроцессами на одном процессоре

Отчёт по лабораторной работе на тему «3d графика»
В данной лабораторной работе использовалась программа Autodesk 3ds Max 2009 и Adobe Photoshop cs4

Отчет по лабораторной работе №9 по курсу «компьютерная графика» Студент...
Вариант 28**: Забить пробный гвоздь в тестовую доску (прямоугольную в поперечном сечении)

Отчёт о лабораторной работе №2 «Анализ огм последовательных программ...
Для полученного графа построить соответствующую ему поглощающую цепь Маркова (пцм), определить ее фундаментальную матрицу(ФМ) и вектор...

Отчёт о лабораторной работе №2 «Анализ огм последовательных программ...
Для полученного графа построить соответствующую ему поглощающую цепь Маркова (пцм), определить ее фундаментальную матрицу(ФМ) и вектор...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
odtdocs.ru
Главная страница