У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 1718 Тема- Рисование графических фигур на экране монитора Цель работы- приобрест

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 4.3.2025

Лабораторная работа №17-18

Тема: «Рисование графических фигур на экране монитора»

Цель работы: приобрести практические навыки рисования графических фигур на экране монитора.

Краткие теоретические сведения:

1. Библиотека классов Microsoft Foundation Classes (MFC)

Библиотека классов Microsoft Foundation Classes (MFC) содержит набор средств объектно-ориентированного программирования, предназначенных для разработки 32-разрядных приложений. MFC - это мощный инструментарий объектно-ориентированного программирования. 

Библиотека MFC дает возможность использования различных классов объектов. Наиболее важные структуры данных и API-функции инкапсулированы в группы классов, пригодных для многократного использования.

По сравнению с традиционными библиотеками функций, которые использовались в программах на языке С, библиотека MFC имеет много достоинств.

Основные преимущества использования классов C++ следующие:

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

Благодаря MFC код, требуемый для отображения окна приложения, можно сократить примерно в три раза. При этом появляется возможность уделять больше времени и внимания разработке процедур взаимодействия приложения с Windows, для решения которых и создается приложение.

В основу MFC положены следующие принципы:

  1.  возможность комбинирования обычных вызовов функций с методами классов;
  2.  баланс между производительностью и эффективностью базовых классов;
  3.  преемственность в переходе от использования API-функций к библиотеке классов;
  4.  простоту переноса библиотеки классов на разные платформы ОС.
  5.  наиболее полное использование возможностей C++ без чрезмерного усложнения программного кода.

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

При создании MFC также учтены возможности работы в смешанном режиме. Другими словами, в одной программе могут применяться как библиотека  MFC, так и API-функции.

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

Основные достоинства библиотеки MFC:

  1.  Расширенная система обработки исключительных ситуаций, благодаря которой приложения менее чувствительны к ошибкам и сбоям. Такие ошибки, как «нехватка памяти» обрабатываются автоматически.
  2.  Улучшенная система диагностики, позволяющая записывать в файл информацию об используемых объектах. Сюда также следует отнести возможность контроля корректности значений переменных-членов.
  3.  Полная поддержка всех API-функций, элементов управления, сообщений, GDI, графических примитивов, меню и диалоговых окон.
  4.  Возможность определить тип объекта во время выполнения программы. Это позволяет осуществлять динамическое манипулирование свойствами экземпляров классов.
  5.  Отпала необходимость в использовании многочисленных громоздких структур switch/case, которые часто являются источниками ошибок. Все сообщения связываются с их обработчиками внутри классов. Этот способ привязки сообщений к обработчикам событий применим ко всем сообщениям.
  6.  Небольшой размер и быстрота выполнения программного кода. Как уже говорилось выше, по этим показателям MFC не уступает стандартным библиотечным функциям языка С.
  7.  Поддержка COM (Component Object Model - модель компонентных объектов).
  8.  Использование тех же соглашений об именовании методов классов, которые применялись при подборе имен для API-функций Windows. Это существенно облегчает идентификацию действий, выполняемых классами.

Библиотека MFC поставляется вместе с исходными текстами классов, что дает возможность настраивать базовые классы в соответствии со своими потребностями.

2. Создание проекта программы рисования фигур

Используя мастер Application Wizard,  создадим проект с именем GDI. Для этого необходимо:

  1.  В меню File открыть вкладку New, Project, выбрать иконку MFC Application, в окне Name: набрать имя gdi, в окне Location: указать путь к папке, в которую будет записан проект, нажать ОК.
  2.  На вкладке MFC Application Wizard – выбрать Application Type и установить Single documents (поддержка единичного документа), MFC standard, Use MFC in a static library, Document/View architecture support, Resource language – Английский (США).
  3.  На вкладке MFC Application Wizard – выбрать Compound Document Support, установить None.
  4.  На вкладке MFC Application Wizard -  Document Template Strings  должны стоять стандартные установки.
  5.  На вкладке MFC Application Wizard – выбрать Database support и установить None.
  6.  На вкладке MFC Application Wizard – выбрать User Interface Features и установить Thick frame, Minimize box, Maximize box, System menu, Toolbars - None.
  7.  На вкладке MFC  Application Wizard – выбрать Advance Features,  снять все установки, Number of files on recent file list – 4.
  8.  На вкладке MFC Application Wizard – Generated Classes должен появиться  перечень из 4  классов проекта: CgdiView, CgdiApp, CgdiDoc, CMainFrame.
  9.  В итоге получим папку с файлами проекта Gdi. Если папка с файлами проекта не появилась на экране, необходимо выбрать в меню View, Solution Explorer. Открыв папку Source Files, можно убедиться в наличии файлов проекта.

        Для того, чтобы иметь возможность рисовать в рабочей области приложения графические фигуры, нужно предварительно модифицировать часть файла исходного кода gdiView.cpp. Для этого необходимо открыть этот файл, щелкнув по нему мышью, затем в этом файле найти фрагмент , озаглавленный как CgdiView drawing.

Файл GdiView.cpp, который содержит реализацию класса CGdiView, порождается от класса CGdiView и управляет отображением документа на экране монитора. В файл класса CGdiView добавлен фрагмент, выделенный полужирным шрифтом, который позволяет производит окраску графических фигур указанными цветами.

3. Программа рисования фигур

// GdiView.cpp : реализация класса CGdiView 

#include "stdafx.h"

#include "Gdi. h"

#include "GdiDoc.h"

#include "GdiView.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

//CGdiViewdrawing

void CgdiView :: OnDraw(CDC* pDC) {

CGdiDoc* pDoc = GetDocument( );

ASSERT_VALID(pDoc);

static DWORD dwColor[9]={

RGB(0,0,0),        //черный

RGB(255,0,0),       //красный

RGB(0,255,0),       //зеленый

RGB(0,0,255),       //синий

RGB(255,255,0),       //желтый 

RGB(255,0,255),       //пурпурный

RGB(0,255,255),       //голубой

RGB(127,127,127),       //серый

RGB(255,255,255)};       //белый

int xcoord;

POINT polylpts[4],polygpts[5];

CBrush newbrush;

CBrush* oldbrush;

CPen newpen;

CPen* oldpen;

// рисование толстой диагональной линии

newpen.CreatePen(PS_SOLID,6,dwColor[0]);

oldpen=pDC->SelectObject(&newpen);

pDC->MoveTo(0,0);

pDC->LineTo(640,430);

pDC->TextOut(70,20,"<-diagonalline",15);

// удаление пера 

pDC->SelectObject (oldpen);

newpen.DeleteObject();

// рисование синей дуги

newpen.CreatePen(PS_DASH,1,dwColor[3]);

oldpen=pDC->SelectObject(&newpen);

pDC->Arc(100,100,200,200,150,175,175,150);

pDC->TextOut(80,180,"smal1 arc->",11);

// удаление пера

pDC->SelectObject(oldpen);

newpen.DeleteObject( );

// рисование сегмента с толстым зеленым контуром

newpen.CreatePen(PS_SOLID,8,dwColor[2]);

oldpen=pDC->SelectObject(&newpen);

pDC->Chord(550,20,630,80,555,25,625,70);

pDC->TextOut(485,30,"chord->",7);

// удаление пера

pDC->SelectObject(oldpen);

newpen.DeleteObject ( );

// рисование эллипса и заливка его красным цветом

CreatePen(PS_SOLID,1,dwColor[1]);

oldpen=pDC->SelectObject(&newpen);

newbrush.CreateSolidBrush(dwColor[1]);

oldbrush=pDC->SelectObject(&newbrush);

pDC->Ellipse(180,180,285,260);

pDC->TextOut(210,215, "ellipse", 7);

// удаление кисти 

pDC->SelectObject(oldbrush);

newbrush.DeleteObject();  

// удаление пера 

pDC->SelectObject(oldpen);

newpen. DeleteObject (  );

// рисование  круга и заливка его синим цветом

newpen.CreatePen(PS_SOLID,1,dwColor[3]);

oldpen=pDC->SelectObject(&newpen);

newbrush.CreateSolidBrush (dwColor[3]);

oldbrush=pDC->SelectObject(&newbrush);

pDC->Ellipse(380,180,570,370);

pDC->TextOut(450,265,"circle",6);

// удаление кисти 

pDC->SelectObject(oldbrush);

newbrush.DeleteObject() ;

// удаление пера 

pDC->SelectObject(oldpen) ;

newpen.DeleteObject();

// рисование сектора и заливка его зеленым цветом

newpen.CreatePen(PS_SOLID,1,dwColor[0]);

oldpen=pDC->SelectObject(&newpen);

newbrush.CreateSolidBrush(dwColor[2]);

oldbrush=pDC->SelectObject(&newbrush);

pDC->Pie(300,50,400,150,300,50,300,100);  

pDC->TextOut(350,80,"<-pie wedge",11);

// удаление кисти

pDC->SelectObject(oldbrush) ;

newbrush.DeleteObject();

//удаление пера

pDC->SelectObject(oldpen) ;

newpen.DeleteObject();

// рисование прямоугольника и заливка его серым цветом

newbrush.CreateSolidBrush(dwColor[7]);

oldbrush=pDC->SelectObject(&newbrush);

pDC->Rectangle(50,300,150,400);

pDC->TextOut(160,350,"<-rectangle",11);

// удаление кисти 

pDC->SelectObject(oldbrush);

newbrush.DeleteObject( );

// рисование закругленного прямоугольника и заливка его синим цветом

newbrush.CreateHatchBrush(HS_CROSS,dwColor[3]);

oldbrush=pDC->SelectObject(&newbrush);

pDC->RoundRect(60,310,110,350,20,20);

pDC->TextOut (120,310,"<-rounded rectangle" ,19);

// удаление кисти

pDC->SelectObject(oldbrush);

newbrush.DeleteObject( );

// рисование нескольких точек

for(xcoord=400;xcoord<450;xcoord+=3)

pDC->SetPixel(xcoord,150,0L);

pDC->TextOut(455,145,"<-pixels",8);

// рисование толстой ломаной линии пурпурного цвета

newpen.CreatePen(PS_SOLID,3,dwColor[5]);

oldpen=pDC->SelectObject(&newpen);

polylpts[0].x=10;

polylpts[0].y=30;

polylpts[1].x=10;

polylpts[1].y=100;

polylpts[2].x=50;

polylpts[2].y=100;

polylpts[3].x=10;

polylpts[3].y=30;

pDC->Polyline(polylpts,4);

pDC->TextOut(10,110,"polyline",8);

// удаление пера

pDC->SelectObject(oldpen);

newpen.DeleteObject( );

// рисование многоугольника с голубым контуром и заливка его диаг. желтой штриховкой

newpen.CreatePen(PS_SOLID,4,dwColor[6]);

oldpen=pDC->SelectObject(&newpen);

newbrush.CreateHatchBrush(HS_FDIAGONAL,dwColor[4]);

oldbrush=pDC->SelectObject(&newbrush);

polygpts[0].x=40;

polygpts[0].y=200;

polygpts[1].x=100;

polygpts[1].y=270;

polygpts[2].x=80;

polygpts[2].y=290;

polygpts[3].x=20;

polygpts[3].y=220;

polygpts[4].x=40;

polygpts[4].y=200;

pDC->Polygon(polygpts,5);

pDC->TextOut(70,210,"<-polygon",9);

// удаление кисти

pDC->SelectObject(oldbrush);

newbrush.DeleteObject ();

// удаление пера

pDC-> SelectObject(oldpen);

newpen.DeleteObject( );

}

После ввода кода рисования фигур необходимо выполнить компиляцию программы, для этого в меню Build следует выбрать Build Solution. В результате компиляции в папке Debug проекта будет создан файл Cview.cpp, выполнение которого обеспечивает рисование указанных в файле фигур.

4. Пояснения к программе рисования фигур

Рисование линий и геометрических фигур с заданным цветом выполняется программируемыми «перьями», а раскраска фигур осуществляется «кистями», которые реализуются в классах CBrush и СРеn.

Структура dwColor: создается массив, в котором хранятся девять RGB-значений цветов для используемых кистей и перьев:

static DWORD dwColor[9]=

{

RGB(0,0,0),         //черный

RGB(255,0,0), //красный

RGB(0,255,0), //зеленый

RGBCO,0,255), //синий

RGB(255,255,0), //желтый

RGB(255,0,255), //пурпурный

RGB(0,255,255), //голубой

RGB(127,127,127), //серый

RGB(255,255,255) //белый

};

Кисти и перья создаются с помощью классов CBrush и СРеn, которые можно передавать функциям класса CDC - базового класса для контекста устройства отображения. Кисти могут иметь сплошную и штриховую заливку, а также заливку в виде растрового узора. Перья рисуют сплошной, штриховой или пунктирной линиями. Синтаксис программы, отвечающей за создание кистей перьев, приведен ниже:

CBrush newbrush;

CBrush* oldbrush;

CPen  newpen;

CPen* oldpen;

Поскольку для рисования различных графических примитивов применяются аналогичные алгоритмы, рассмотрим лишь два наиболее типичных фрагмента. В первом случае на экран выводится толстая черная диагональная линия.

// рисование толстой черной диагональной линии

newpen.CreatePen(PS_SOLID,6,dwColor[0]);

oldpen-pDC->SelectObject(&newpen);

pDC->MoveTo(0,0);

pDC->LineTo(640,430);

pDC->TextOut(70,20,"<-diagonal 1ine",15);

// удаление пера

pDC->SelectObject(oldpen);

newpen.DeleteObjectO;

Перо создается функцией CreatePen(), которая задает рисование черных сплошных линий толщиной в шесть логических единиц. Сразу после этого функция SelectObject() обновляет перо, связывает его с контекстом устройства отображения (экраном монотора) и возвращает указатель на предыдущий объект пера. Функции LineTo() формируют диагональную линию, которая рисуется выбранными пером. Наконец, функция TextOut() выводит рядом с нарисованной фигурой надпись.

Работа с кистями организована аналогичным образом. В следующем коде создается кисть с заливкой в виде горизонтальных и вертикальных штрихов (HS_CROSS) синего цвета:

// рисование черного закругленного прямоугольника и заливка его синим цветом

newbrush.CreateHatchBrush(HS_CROSS,dwColor[3]);

oldbrush=pDC->SelectObject(&newbrush);

pDC->RoundRect(60,310,110,350,20,20);

pDC->TextOut (120,310,"<-rounded rectangle",19);

// удаление кисти

pDC->SelectObject(oldbrush);

newbrush.DeleteObject С);

Функция RoundRect () рисует прямоугольник с закругленными краями и заданными координатами, после чего выводится надпись. Все остальные фигуры рисуются аналогичным образом.

Перечень оборудования, аппаратного и программного обеспечения:

- персональный компьютер;

- программная среда Visual C++ .NET 2003.

Порядок выполнения работы:

1. Изучить работу Мастера MFC приложений.

2. Создать проект MFC приложения для рисования фигур.

3. Вставить фрагмент рисования фигур в файл СGdiView.cpp после строки  // GdiView drawing, отредактировать и выполнить программу.

4. Подготовить отчет.

5. Ответить на контрольные вопросы.

Порядок выполнения программ в среде Visual C++ .NET 2003:

1. Запустить Microsoft Visual Studio C++ .NET 2003/

2. Создать MFC проект под именем Gdi.

3. Набрать текст программы рисования фигур в файл СGdiView.cpp.

4. Создать файл Gdi.exe. Для этого необходимо выделить файл СGdiView.cpp. В меню Build выбрать Build Solution. Исправить ошибки компиляции.

5. Запустить программу, результаты работы программы проанализировать на экране дисплея.

Контрольные вопросы:

1. Особенности и классы MFC библиотеки?

2. Какие файлы составляют проект в MFC приложении?

3. Как формируются цвета в программе рисования фигур?

4. Какие основные инструменты используются при рисовании фигур?

5. Как в программе реализуются инструменты для рисования и заливки фигур различными цветами?

6. Поясните работу программы рисования фигур.

Содержание отчета:

1. Титульный лист.

2. Цель работы, перечень оборудования, аппаратного и программного обеспечения.

3. Скриншот экрана с нарисованными фигурами.

4. Ответы на контрольные вопросы.

5. Выводы о проделанной работе.




1. Особливості творчості Льюїса Керролла
2. Этика поведения медицинских работников
3. О вере в науку
4. Интегрированный урок по математике и русскому языку на основе изучения карело-финского эпоса Калевала
5. Этническая культура
6. Основные направления современной мировой философии
7. Грицько на груші В.
8. ИКФ ЭКМОС Москва 2002 ББК 67.
9. административной системы к рыночным методам хозяйствования
10. Пермский государственный национальный исследовательский университет Юридический факультет Кафед