Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Классы изобразительных средств. Примеры рисования простейших фигур.




Классы изобразительных средств

В контексте устройства есть ряд классов изобразительных средств, которые являются наследниками CGdiObject. В MFC их шесть.

CObject -      |-CBitmap

       |         |-CBrush

       CGdiObject---|-CFont

                      |-CPalette

                      |-CPen

                      |-CRgn

Теперь кратко о каждом классе. CBitmap - это класс, который умеет работать с растровыми изображениями. CBrush - это кисть для рисования. CFont - класс шрифта текста. CPalette - класс умеющий работать с цветовыми палитрами. CPen - класс пера и CRgn - класс региона, то есть области вывода.

 

Рисование простейших фигур

 


Рассмотрим примеры:

Вывести строку:

void CMainWnd::OnPaint()

{

CPaintDC dc(this);

dc.TextOut( X1, Y1,"TextOut Samples");

}

Вывести точку, чем выше разрешение экрана, тем меньше точка.

void CMainWnd::OnPaint()

{

CPaintDC dc(this);

dc.SetPixel(500,200,RGB(255,0,0));

}

Дуга окружности:

void CMainWnd::OnPaint()

{

CPaintDC dc(this);

dc.Arc(200,200,100,100,400,400,10,10);

}

Замкнутая дуга:

void CMainWnd::OnPaint()

{

CPaintDC dc(this);

dc.Chord(250,250,100,100,400,400,10,10);

}

Эллипс:

void CMainWnd::OnPaint()

{

CPaintDC dc(this);

dc.Ellipse(450,450,50,150);

}

Линия:

void CMainWnd::OnPaint()

{

CPaintDC dc(this);

dc.MoveTo(200,200);

dc.LineTo(100,100);

}


 



Как выполняется рисование и вычерчивание в программе, использующей MFC

Одно из основных сообщений, которое должна уметь обрабатывать любая Windows-программа, — сообщение WM_PAINT. Операционная система Windows посылает это сообщение окну приложения (точнее— объекту, представляющему окно) при любой; операции, требующей перерисовки изображения в окне. Несколько событий могут стать причиной возникновения необходимости в такой перерисовке.

• Первое из них —запуск программы. В правильно организованной Windows-программе окно приложения получает сообщение WM_PAINT практически немедленно после запуска с тем, чтобы данные, соответствующие исходному состоянию приложения, сразу же были предъявлены пользователю.

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

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

Когда будем рассматривать карту сообщений, мы познакомимся с соглашением о преобразовании идентификатора сообщения в имя макроса карты сообщений и имя функции. Для сообщения - WM_PAINT , соответствующий макрос будет называться ON_WM_PAINT(), а соответствующая функция— OnPaint(). Это пример того, как MFC берет на себя значительную часть работы по соотнесению сообщений Windows с функциями их обработки.

Текст функции CView::OnPaint() представлен ниже.

 

void CView::OnPaint()

{// Стандартная последовательность вызовов для прорисовки.

CPaintDC dc(this);

OnPrepareDC(&dc);

OnDraw(&dc);

}

Класс CPaintDC — это специальный класс для управления контекстами отрисовки (paint DCs) — контекстами устройств, которые используются только для реакции на сообщения WM_PAINT. Объект класса CPaintDC делает нечто большее, чем просто создание контекста устройства. Он также вызывает BeginPaint() — функцию Windows API — в конструкторе класса и функцию EndPaint() — в деструкторе. В процессе реакции на сообщение WM_PAINT необходимо вызывать и BeginPaint(), и EndPaint(). Класс CPaintDC избавляет вас от необходимости заботиться о таких мелочах. Конструктор класса CPaintDC требует одного аргумента— указателя на объект, представляющий окно, для которого и создается контекст устройства. Указатель this указывает на текущее окно, т.е. конструктору дается задание создать контекст для текущего окна.

Функция ОnРгерагеDС() является членом класса CView. Она подготавливает контекст устройства для дальнейшего использования.

Функция OnDraw() берет на себя всю работу по обновлению представления документа на экране. В большинстве случаев для каждого приложения нужно разрабатывать собственную функцию OnDraw() и никогда не вносить изменений в предлагаемый MFC текст функции OnPaint().

Изменение размеров и положения окна

В программе, использующей MFC, можно изменить размеры и положение окна с помощью функции PreCreateWindowO— члена класса главного окна приложения. Она вызывается автоматически перед началом формирования главного окна приложения. В главном окне содержатся все видимые объекты приложения и определяется размер представления.

Функция PreCreateWindow() имеет один аргумент— ссылку на экземпляр структуры CREATESTRUCT. Эта структура содержит всю информацию об окне, которое должно появиться на экране.

Если при создании приложения Windows вы не будете пользоваться библиотекой MFC, то со структурой CREATESTRUCT столкнетесь при обращении к функции API CreateWindow(), которая формирует окно приложения. Особое внимание тех, кто программирует с помощью MFC, привлекают члены сх, су, х и у. Изменяя сх и су, можно регулировать ширину и высоту окна, а изменяя х и у, — положение окна на экране. Перегрузив функцию PreCreateWi ndow(), вы получаете шанс пообщаться со структурой CREATESTRUCT еще до того, как Windows использует ее для формирования окна.

AppWizard уже создал CMainFrame:: PreCreateWindow(). Так что можете развернуть класс СМаin Frame в окне ClassView, дважды щелкнуть на названии PreCreateWindow() и отредактировать текст функции— включить в нее фрагмент:

 

BOOL CMainFrame: : PreCreateWindow(CREATESTRUCT& cs)

{cs.cx = 440;

cs.cy = 480;

if(!CFrameWnd::PreCreateWindow(cs)) return FALSE;

return TRUE;}

Эти операторы устанавливают новые высоту и ширину окна приложения.

 

Использование перьев. Работа с кистью.

Использование перьев

Для пера требуется определить стиль начертания линии, ее толщину и цвет. Рассмотрим функцию ShowPens() , которая формирует различные типы перьев в теле цикла for.

void CPaint1View::ShowPens(CDC * pDC)

{

// Инициализировать положение линии.

UINT position =10;

// Начертить шестнадцать линий.

for (UINT x=0; х<16; ++х)

{

// Сформировать новое перо и выбрать его в контекст.

CPen pen(PS_SOLID, x*2+1, RGB(0, 0, 255));

CPen* oldPen = pDC->SelectObject(&pen);

// Начертить линию новым пером.

position += x * 2 + 10;

pDC->MoveTo(20, position);

pDC->LineTo(400, position);

// Восстановить прежнее перо в контексте.

pDC->SelectObject(оldPen);

}

}

В теле цикла ShowPens() сначала формирует новое перо — экземпляр класса CPen. Конструктору требуется передать три параметра. Первый— стиль линии. Варианты стилей:

Стиль                              Описание'

PS DASH                Перо вычерчивает штриховую линию

PS DASHDOT        Перо вычерчивает штрихпунктирную линию

PS DASHDOTOOT Перо вычерчивает штрихпунктирную линию с двумя точками

PS DOT                   Перо вычерчивает пунктирную линию

PS INSIDEFRAME Перо используется для вычерчивания линий внутри замкнутого контура

PS NULL                 Перо вычерчивает невидимую линию

PS SOLID                Перо вычерчивает сплошную линию

 

Только сплошные линии могут иметь регулируемую толщину. Все линии, вычерчиваемые по шаблону, должны иметь толщину 1. Второй параметр — толщина линии, которая увеличивается в каждом последующем цикле. Третий параметр— цвет линии. Макрос RGB принимает три значения соответственно для красной, зеленой и синей составляющих, и преобразует их в комбинированный код цвета, воспринимаемый Windows. Значения интенсивностей компонентов находятся в диапазоне 0-255 (естественно, чем больше величина, тем более интенсивный цвет).

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)};// белый

 

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

Покончив с созданием нового пера, функция ShowPens() выбирает его в контекст, сохраняя, тем не менее, указатель старого пера. Метод MoveTo() перемещает перо в точку с координатами X,Y без вычерчивания; метод LineТо() собственно и выполняет вычерчивание, "передвигая" перо вдоль прямой линии. При этом используются заказанные стиль, толщина и цвет пера. И последнее — в контексте восстанавливается прежнее перо.

Работа с кистью

Перо вычерчивает на экране линии заданной толщины. Кисть же закрашивает (заливает) внутреннюю область замкнутых фигур. Можно создавать сплошные кисти или стандартные трафаретные (pattern) и даже творить кисти из растровых картинок, которые будут содержать трафареты, созданные вашей фантазией. Функция ShowBrushes() продемонстрирует как сплошные кисти, так и стандартные трафаретные, которые будут использованы для заливки прямоугольников.

void CPaintlView::ShowBrushes(CDC * pDC)

{                            '

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

UlNT position = 0;

//Выбрать перо для вычерчивания контура прямоугольника.

СРеn pen(PS_SOLID, 5, RGB(255, 0, 0));

CPen* oldPen = pDC->SelectObject(&pen);

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

for (UINT x=0; x<7; ++x)

{

CBrush* brush;

// Создать сплошную или заштрихованную кисть

if(x==6)

brush = new CBrush(RGB(0,255,0));

else

brush = new CBrush(x, RGB(0,160,0));

//Выбрать новую кисть в контекст.

CBrush* oldBrush = pDC->SelectObject(brush);

// Начертить прямоугольник.

position += 50;

pDC->Rectangle(20, position, 400, position + 40);

// Восстановить контекст и стереть кисть.

pDC->SelectObject(oldBrush);

delete brush;

}

//Восстановить прежнее перо в контексте

pDC->SelectObject(oldPen);

}

Все прямоугольники, закрашиваемые различными кистями, будут вычерчены с видимой линией контура. Для этого нужно создать перо (стиль — сплошное, толщина — 5 пикселей, цвет— ярко-красное) и выбрать его в контекст устройства. Оно будет безо всяких на то дополнительных указаний использовано для вычерчивания контуров прямоугольников. Подобно функции ShowPensO, эта программа также использует для демонстрации кистей цикл for. Однако в отличие от предыдущей функции новые объекты (в этой функции — кисти) создаются вызовом new. Это позволяет использовать то конструктор с одним аргументом, который создает сплошную кисть, то конструктор с двумя аргументами, который создает трафаретную кисть.

Первый аргумент двухаргументного конструктора есть переменная цикла х;

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

•. HS..HORIZONTAL (горизонтальный)

• HS_VERTICAL (вертикальный)

• HS_CROSS (прямая клетка)

• HS_FDIAGONAL (диагональный, наклон влево)

• HS_BDIAGONAL (диагональный, наклон вправо)

• HS_D I AGONALCROSS (косая клетка)

В теле цикла в контекст выбирается один из этих трафаретов, определяется положение очередного прямоугольника в поле окна и затем вызывается функция Rectangle(), которая и использует контекст с включёнными в: него пером и кистью. После всего этого в контексте восстанавливается прежняя кисть. После выхода из цикла в контексте восстанавливается и перо.

Метод Rectang1е() — это только один из методов, используемых для построения на экране замкнутых фигур. Rectanglе()использует в качестве аргументов координаты левого верхнего и правого нижнего углов вычерчиваемого прямоугольника: Среди других методов, представляющих определенный интерес,—Chord (), , Ellipse(), Pie() - сектор, Polygon() - многоугольник, PolyPolygon() – массив многоугольников, Polyline() – линия, соединяющая массив точек, и RoundRect() – прямоугольник со скругленными углами.

 

 

Концепция сохранения - восстановления объектов. Необходимые действия по обеспечению возможности сохранения восстановления объектов класса CDocument. Разбор примера с сериализацией в классе документа.










Последнее изменение этой страницы: 2018-04-12; просмотров: 275.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...