МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
(СФУ)
Филиал
ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО АВТОНОМНОГО
ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
В Г. ЖЕЛЕЗНОГОРСКЕ
«Утверждаю» | ||
Заведующий кафедрой АСОИУ
|
,
ПОСТРОЕНИЯ ГРАФИЧЕСКИХ СИСТЕМ
С ПРИМЕНЕНИЕМ ИНСТРУМЕНТОВ WINAPI И GDI+
Методические указания к выполнению лабораторных работ
по дисциплине: «Компьютерная графика»
г. Красноярск, 2011
Аннотация
Настоящие методические указания предназначены для приобретения у студентов навыков построения графических систем с использованием интерфейса WinAPI и библиотек GDI+.
Содержание
1 Архитектура программ в ОС Windows
1.1 Цикл обработки сообщений
1.2 Контекст устройства
1.3 GDI и GDI+
1.4 Задание для самостоятельной работы
2 Вывод информации
2.1 Библиотека GDI+
2.2 Точка, прямоугольная область, размер, цвет
2.3 Перо, кисть, шрифт
2.4 Основной класс рисования Graphics
2.5 Задание для самостоятельной работы
3 Цвет в компьютерной графике
3.1 Классификация и различия цветовых моделей
3.2 Распространённые цветовые модели
3.3 Цветовая модель RGB
3.4 Цветовая модель HSV
3.5 Преобразование цветовых компонентов между моделями RGB и HSV
3.6 Масштабирование изображений средствами GDI+
3.7 Задание для самостоятельной работы
4 Перемещение и анимация изображений
4.1 MFC. Отличия в обработке сообщений от чистого WinApi
4.2 Задание для самостоятельной работы
5 Построение примитивной САПР
5.1 Задание для самостоятельной работы
2 Архитектура программ в ОС Windows
· цикл обработки сообщений
· оконные сообщения
· контекст устройства
Приложение «ФИО»
2.1 Цикл обработки сообщений
2.1.1 WinMain
Функция WinMain – это общее название точки входа в приложение Microsoft Windows.
Синтаксис
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
Параметры
hInstance
[in] Хэндл текущего экземпляра приложения.
hPrevInstance
[in] Хэндл предыдущего экземпляра приложения. Этот параметр всегда равен NULL.
lpCmdLine
[in] Указатель на строку, оканчивающуюся нулём, и содержащую параметры запуска приложения, за исключением имени программы. Чтобы получить командую строку полностью, используйте функцию GetCommandLine.
nCmdShow
[in] Определяет способ отображения окна. Параметр может принимать одно из следующих значений:
SW_HIDE – скрывает окно и активизирует другое
SW_SHOW – активизирует окно и отображает его в текущей позиции с текущим размером
SW_SHOWMAXIMIZED – активизирует окно и отображает его максимизированным.
SW_SHOWMINIMIZED– активизирует окно и отображает его минимизированным.
Возвращаемое значение
В случае успеха, то есть при завершении по получении сообщения WM_QUIT, должна возвращать значение, содержащееся в параметре wParam этого сообщения. Если функции завершается прежде, чем был осуществлен вход в цикл сообщений, она должна возвращать ноль.
2.1.2 GetMessage
Функция GetMessage извлекает сообщение из очереди сообщений вызывающего потока.
Синтаксис
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
Возвращаемое значение
Если функция получает сообщение отличное от WM_QUIT, то возвращаемое значение не ноль.
Если функция получает сообщение WM_QUIT, то возвращаемое значение – ноль.
2.1.3 WindowProc
Функция WindowProc определяется разработчиком приложения и обрабатывает сообщения, отправляемые в окно. Тип данных WNDPROC определяет указатель на параметры вызова этой функции. WindowProc всего лишь шаблонное имя функции, определяемой разработчиком.
Синтаксис
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
Параметры
hwnd
[in] Хэндл окна
uMsg
[in] Указатель на сообщение
wParam
[in] Дополнительная информация о сообщении. Содержимое этого параметра зависит от значения параметра uMsg.
lParam
[in] Дополнительная информация о сообщении. Содержимое этого параметра зависит от значения параметра uMsg.
Возвращаемое значение
Возвращаемое значение является результатом обработки сообщения и зависит от переданного сообщения.
2.2 Контекст устройства
Во-первых, в Microsoft Windows существует несколько средств для вывода графической информации, включая DirectDraw, OpenGL, GDI и т. д. Мы рассмотрим GDI (Graphics Device Interface) - подсистему Windows, ответственную за вывод графики и текста на дисплей и принтер. Именно она занимается выводом большинства "окошек", которые и составляют то, что видит пользователь Windows на экране. Она является базовым и, пожалуй, простейшим способом вывода графики в Windows.
С графикой Windows с помощью GDI неразрывно связано понятия контекста устройства (device context). Контекст устройства (DC) - это структура данных, содержащая информацию о параметрах и атрибутах вывода графики на устройство (например, дисплей или принтер). Такая информация, в частности, включает в себя: палитру устройства, определяющую набор доступных цветов; параметры пера для черчения линий; параметры кисти для закраски и заливки; параметры шрифта, использующегося для вывода текста.
В GDI существуют пять типов контекста устройства - связанный с дисплеем (Display DC), принтером (Printer DC), контекст виртуального устройства в памяти (Memory DC), контекст метафайла (Metafile DC) и специальный вид контекста - информационный (Information DC).
Первые четыре типа контекста устройства - display, printer, memory и metafile предоставляют унифицированный интерфейс для вывода графической информации на разнотипные устройства, освобождая приложение (и его разработчика) от необходимости заботится о том, куда именно производится вывод графики. Информационный контекст для вывода графики не используется, он служит исключительно для получения информации о параметрах и поддерживаемых режимах устройства, с которым связан.
В чем отличие первых четырех типов контекста? Это можно понять из их названий - Display DC служит для вывода на экран, Printer DC для печати на принтер или графопостроитель, Memory DC служит для создания растровых изображений в памяти с возможностью быстрого их копирования в другие типы контекстов (и обратно), Metafile DC нужен для вывода графики в метафайл. Метафайл - это хранилище последовательности команд GDI, каждая из которых описывает одну графическую функцию. В отличие от растровых файлов, хранящих графическую информацию непосредственно в виде массива пикселов, метафайл ее хранит в виде последовательности команд, которая создает результирующий рисунок.
2.3 GDI и GDI+
За последний год компания Microsoft подготовила разработчикам множество сюрпризов. Новые продукты и технологии буквально завладели вниманием околокомпьютерного мира. Пока неясно, насколько успешным будет дебют технологии. NET и основанных на ней программных продуктов и средств разработки. Но одно из новшеств, безусловно, уже завоевало признание разработчиков, связанных с графикой и мультимедиа, - технология GDI+. Именно она, вернее, основанный на ней новый графический интерфейс является "лицом" новых операционных систем - Windows XP и. NET Server.
Что же такое GDI+? Официальная документация скромно называет ее Class-based API, то есть основанным на классах интерфейсе прикладных программ. Так как она встроена в Windows XP и. NET Server, ее называют частью этих операционных систем. Часто встречается также определение "библиотека" или "библиотека классов". В действительности, предоставляемый GDI+ набор классов является тонкой оболочкой над множеством обычных функций, реализованных в одной динамической библиотеке GdiPlus. dll. В общем, имея все это в виду, будем для краткости далее называть ее просто библиотекой.
Итак, GDI+ - это библиотека, призванная заменить существующий уже больше 11 (или 18 - как считать) лет интерфейс GDI, являющийся графическим ядром предыдущих версий Windows. Она сочетает в себе (по крайней мере, по замыслу) все достоинства своего предшественника и предоставляет множество новых мощных возможностей. Кроме того, при ее проектировании заранее ставилась цель наименее болезненного переноса приложений на 64-битные платформы. Следовательно, хотя существующие GDI-приложения будут выполняться на новых версиях Windows, для новых проектов следует использовать GDI+.
2.4 Задание для самостоятельной работы
Цель. Подключение библиотеки GDI+. Создание обработчика WM_PAINT. Вывод текста на экран.
Задание. Разработать Win32 приложение, которое обрабатывает оконное сообщение WM_PAINT и выводит на экран сведения о группе и ФИО студента.
Примечание. Справка MSDN: GDI+ Reference
ms-help://MS. VSCC. v90/MS. MSDNQTR. v90.en/gdicpp/GDIPlus/GDIPlusreference. htm
Последовательность выполнения
1. Создать новый проект.
File – New Project – Other Languages – Visual C++ – Win32 – Win32 Project
2. Задать имя проекту «Lab1»
3. Составить подробные комментарии к приложению
4. Запустить приложение
5. Подключить GDI+
Настроить загрузку модулей GDI+В файле stdafx. h
• Закомментировать строку
#define WIN32_LEAN_AND_MEAN
• Добавить следующие строки
// Подключение библиотеки GDI+
#include <GdiPlus. h>
using namespace Gdiplus;
В файле stdafx. cpp
• Добавить строку
#pragma comment(lib, "GdiPlus. lib")
• В функции _tWinMain(), перед вызовом MyRegisterClass
// Инициализация GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
• В функции _tWinMain(), перед выходом из приложения
// Остановка GDI+
GdiplusShutdown(gdiplusToken);
6. Создать обработчик сообщения WM_PAINT
void OnPaint(HDC hdc, const RECT& rc)
{
// Все строки - в кодировке Unicode
WCHAR welcome[]=L"Тестовое приложение на GDI+ !";
// Создаем контекст рисования и устанавливаем пиксельную систему координат
Graphics g(hdc);
g. SetPageUnit(UnitPixel);
// Площадь для рисования
RectF bounds(0, 0, float(rc. right), float(rc. bottom));
// Кисть рисования
SolidBrush brush(Color(255, 0, 0));
// Определяет форматирование текста
StringFormat format;
format. SetAlignment(StringAlignmentCenter);
format. SetLineAlignment(StringAlignmentCenter);
// Определеяет шрифт текста
Font font(L"Comic Sans MS", 48, FontStyleBold);
// Выводим текст приветствия, длина -1 означает, что строка заканчивается нулем
g. DrawString(welcome, -1, &font, bounds, &format, &brush);
}
7. Вывести в окне информацию: номер группы, ФИО студента
3 Вывод информации
· библиотека классов GDI+
· точка, прямоугольная область, размер, цвет
· перо, кисть, шрифт, форматирование строки
· примитивы и графические объекты
Приложение «График»
3.1 Библиотека GDI+
GDI+ является частью операционной системы (Windows XP и более поздних версий), которая обеспечивает создание двухмерной векторной графики, растровых изображений и их подготовку к типографии. GDI+ имеет расширенные возможности по сравнению с GDI (интерфейс графических устройств для ранних версий Windows).
В состав библиотеки GDI+ входят классы, функции, константы, перечисления и структуры. Далее представлена иерархия классов GDI+.


3.2 Точка, прямоугольная область, размер, цвет
3.2.1 Точка
Класс Point представляет собой параметры точки в двухмерной системе координат. Координаты точки являются целыми числами для Point и вещественными числами для PointF.
Point::Point(INT x, INT y)
PointF::PointF(REAL x, REAL y)
Пример:
PointF pnt(100.0, 35.5);
3.2.2 Прямоугольная область
Объект Rect хранит координаты верхнего левого угла, ширину, и высоту прямоугольной области. Для RectF параметры прямоугольной области задаются вещественными числами.
Rect::Rect(INT x, INT y, INT width, INT height)
RectF::RectF(REAL x, REAL y, REAL width, REAL height)
Пример:
RectF rect(15.0, 20.0, 300.0, 200.0);
3.2.3 Размер
Объект Size хранит ширину и высоту прямоугольной области. Для SizeF параметры прямоугольной области задаются вещественными числами.
Size::Size(INT width, INT height)
SizeF::SizeF(REAL width, REAL height)
Пример:
SizeF size(300.0, 200.0);
3.2.4 Цвет
Объект Color хранит 32-битное значение, представляющее цвет. Значение цвета содержит четыре 8-битных компоненты: старшие 8 разрядов – альфа компонента, далее следуют компоненты красного, зелёного и синего цветов. Каждая компонента принимает значение 0 – 255.
Color::Color(BYTE r, BYTE g, BYTE b) – создаёт объект Color с указанными параметрами красного зелёного и синего.
BYTE Color::GetA() – возвращает значение альфа компоненты
BYTE Color::GetR() – возвращает значение красной компоненты
BYTE Color::GetG() – возвращает значение зелёной компоненты
BYTE Color::GetB() – возвращает значение синей компоненты
void Color::SetValue(ARGB argb) – устанавливает цвет для текущего объекта
Color Color::MakeARGB(BYTE a, BYTE r, BYTE g, BYTE b) – создаёт объект Color с указанными параметрами компонент альфа, красного, зелёного и синего.
Пример:
Color color(100, 255, 10); // светло зелёный
3.3 Перо, кисть, шрифт
3.3.1 Перо
Объект Pen используется для рисования прямых линий и ломаных кривых.
Pen::Pen(Color& color, REAL width) – создаёт объект Pen, используя заданные параметры цвета и толщины.
Status Pen::SetColor(const Color& color) – устанавливает цвет пера.
Status Pen::GetColor(Color *color) – возвращает текущий цвет пера.
Status Pen::SetWidth(REAL width) – устанавливает толщину пера.
Status Pen::GetWidth(REAL *width) – возвращает текущую толщину пера.
Пример:
Pen pen(Color(255,0,0), 4.0);
3.3.2 Кисть
Класс Brush это абстрактный базовый класс, который определяет объект Brush. Объект Brush используется для закрашивания внутренней области графических фигур таких, например, как прямоугольники, эллипсы, сектора, полигоны или задания цвета текста.
Класс SolidBrush определяет сплошной цвет для объекта Brush.
SolidBrush::SolidBrush(const Color& color) – создаёт объект SolidBrush, используя заданный цвет
Status SolidBrush::SetColor(const Color& color) – устанавливает цвет кисти.
Status SolidBrush::GetColor(Color *color) – возвращает текущий цвет кисти.
Пример:
SolidBrush brush(Color(0, 0, 255));
3.3.3 Шрифт
Объект Font используется для задания параметров начертания текстовых строк и включает в себя такие характеристики шрифта как наименование, высота, размер, стиль.
Font::Font(WCHAR* familyName, REAL emSize, INT style, Unit unit, FontCollection* fontCollection)
familyName
[in] Наименование семейства шрифта
emSize
[in] Вещественное число, которое определяет размер шрифта в единицах, определяемых параметром unit.
style
[in] Необязательный параметр. Определяет начертание шрифта. Принимает одно или комбинацию значений из перечисления FontStyle (FontStyleRegular, FontStyleBold, FontStyleItalic). Значение по умолчанию FontStyleRegular
unit
[in] Необязательный параметр. Элемент перечисления Unit, который задаёт единицы измерения для размера шрифта. Значение по умолчанию UnitPoint.
fontCollection
[in] Необязательный параметр. Указатель на объект FontCollection, который определяет пользовательскую группу шрифтов. Если значение параметра NULL, используется коллекция системных шрифтов. Значение по умолчанию NULL.
Пример:
Font font(L"Arial", 20, FontStyleBold);
3.3.4 Форматирование текста
Объект StringFormat включает в себя информацию о расположении текста (выравнивание, ориентацию, позиции табуляции и параметры «обрезки») и способы отображения (отсечение текста, подстановка шрифта для символов, не поддерживаемых требуемым шрифтом). Объект StringFormat может передаваться в методы Graphics::DrawString для форматирования строки.
StringFormat::StringFormat(INT formatFlags, LANGID language)
formatFlags
[in] Необязательный параметр. Значение, определяющее признаки форматирования. Признаки устанавливаются путём применения двоичного оператора к элементам перечисления StringFormatFlags. Значение по умолчанию 0.
language
[in] Необязательный параметр. 16-битное значение, определяющее используемый язык. Значение по умолчанию LANG_NEUTRAL, которое соответствует умалчиваемому языку пользователя.
StringAlignment StringFormat::GetAlignment() – возвращает формат выравнивания по горизонтали внутри прямоугольной области.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |



