Создание и рисование регионов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Создание и рисование регионов



Унифицированным средством, задающим границу области вывода, является регион, который может иметь прямоугольную, многоугольную, эллиптическую формы или их сочетание. Регион является объектом, идентифицируемым его описателем HRGN.

Произвольный регион создается универсальной функцией:

ExtCreateRegion (const XFORM *lpXform, DWORD nDataSize,

const RGNDATA lpRgnData);

структура XFORM описывает преобразование региона в экранные координаты, при его равенстве NULL координаты считаются идентичными; регион описывается структурой RGNDATA, содержащей поля:

RGNDATAHEADER rdh – структура данных заголовка;

char Buffer [1] – буфер структур RECT, образующих регион.

В свою очередь, структура RGNDATAHEADER содержит поля:

DWORD dwSize – размер заголовка в байтах;

DWORD iType – тип региона (RGN _ RECTANGLES);

DWORD nCount – количество прямоугольников в буфере;

DWORD nRgnSize – требуемый размер буфера (может быть нулевым);

RECT rcBound – вмещающий прямоугольник для региона.

Простейший тип региона – прямоугольник может быть создан с помощью функций

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom);

hRgn = CreateRectRgnIndirect (&rect);

Для создания эллиптических регионов:

hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom);

hRgn = CreateEllipticRgnIndirect (&rect);

Функция CreateRoundRectRgn строит прямоугольный регион со скругленными углами.

Создание многоугольного региона (похоже на функцию Polygon):

hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode);

параметр point – массив структур типа POINT, iCount – число точек, iPolyFillModeALTERNATE (WINDING). Регион из множества многоугольников – CreatePolyPolygonRgn.

Два региона могут быть объединены в один функцией:

iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine);

которая комбинирует два исходных региона (hSrcRgn1 и hSrcRgn2) и строит третий, на который ссылается hDestRgn. Все три описателя регионов еще до вызова функции должны быть действительными, однако дополнительный регион, описываемый ранее hDestRgn, уничтожается.

Параметр iCombine задает правило объединения регионов:

RGN_AND – область пересечения двух исходных регионов;

RGN_OR – объединение двух исходных регионов;

RGN_XOR – объединение двух исходных регионов за исключением области пересечения;

RGN_DIFF – часть региона hSrcRgn1, не входящая в регион hSrcRg2;

RGN_COPY– регион hSrcRgn1.

Значение iRgnType, возвращаемое функцией, означает: NULLREGION – регион пуст; SIMPLEREGION – регион представляет собой простой прямо­уго­льник, эллипс или многоугольник; COMPLEXREGION – комбинация прямоугольников, эллипсов или многоугольников; ERROR – произошла ошибка.

Полученный описатель региона можно использовать в функциях

FillRgn (hdc,hRgn,hBrush); FrameRgn (hdc,hRgn,hBrush,xFrame,yFrame);

InvertRgn (hdc, hRgn); PaintRgn (hdc, hRgn);

аналогичных функциям FillRect (закрашивание прямоугольной области), FrameRect (закрашивание границы прямоугольной области) и InvertRect (инвертирование пикселей в прямоугольнике); параметры xFrame и yFrame – ширина и высота рамки, которая будет нарисована вокруг региона.

Функция PaintRgn закрашивает внутреннюю область региона текущей выбранной в контекст устройства кистью. Во всех функциях предполагается, что регион определен в логических координатах.

Для удаления региона используется функция удаления объектов GDI:

DeleteObject (hRgn);

Функция GetRgnData позволяет получить доступ к данным региона по его описателю. Вмещающий прямоугольник для региона может быть получен функцией GetRgnBox.

Функции PtInRegion и RectInRegion проверяют соответственно точку и прямоугольник на вхождение их в регион.

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

 

Прямоугольники и регионы отсечения

Прямоугольники и регионы могут принимать участие в отсечении. Функция InvalidateRect делает недействительным прямоугольную область дисплея и генерирует сообщение WM _ PAINT. Ее можно использовать, например, для обновления рабочей области:

InvalidateRect (hwnd, NULL, TRUE);

Получить координаты недействительного прямоугольника можно с помощью функции GetUpdate­Rect, а сделать действительным прямоугольник в рабочей области – ValidateRec t.

Получая сообщение WM _ PAINT, координаты недействительного прямо­угольника доступны из полей структуры PAINTSTRUCT, заполняемой при вызове функции BeginPaint. Этот недействительный прямоугольник также определяет регион отсечения, за пределами которого нельзя рисовать.

Для создания региона отсечения (выбрав регион в контекст устройства) используются функции

SelectObject (hdc, hRgn); SelectClipRgn (hdc, hRgn);

регион отсечения задается в координатах устройства.

Среда Windows содержит несколько функций для манипуляции с регионом отсечения, таких как ExcludeClipRect – исключение прямо­уголь­ника из региона отсечения; IntersectClipRect – создание нового региона отсечения, который представляет собой пересечение предыдущего региона отсечения и прямоугольника; OffsetClipRgn – перемещение региона отсечения в другую часть рабочей области.

 

Растровая графика

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

Для большинства устройств отображения первичен растровый принцип формирования изображения. Некоторые контексты поддерживают не все функции растровой графики. Информацию о совместимости может предоставить функция GetDeviceCaps ().

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

COLORREF SetPixel (hdc, nX, nY, crColor);

BOOL SetPixelV (hdc, nX, nY, crColor);

COLORREF GetPixel (hdc, nX, nY);

выполняют соответственно изменение состояния (цвета) одной логической точки и получение текущего состояния. Функция SetPixelV () приводит значение цвета к ближайшему представимому в данном контексте цвету; возвращаемое значение – состояние точки на момент вызова функции (COLORREF), либо признак успешности выполнения (BOOL). Параметры

nX, nY – логические координаты точки (int);

crColor – новое значение цвета точки (COLORREF).

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

Битовый образ (bitmap) – двухмерный массив числовых значений, характеризующий состояние точек некоторой области, обычно прямоугольной.

В простейшем случае битовый образ описывается структурой BITMAP, содержащей поля:

LONG bmType – тип образа, должен быть равен 0;

LONG bmWidth, LONG bmHeight – положительные значения ширины и высоты прямоугольной области в пикселах;

LONG bmWidthBytes – размер в байтах образа одной строки изображения, в среде Windows должен быть кратен 2, т.к. система предполагает, что массив состоит из слов;

WORD bmPlanes – количество цветовых планов (плоскостей), т.е. компонент, задающих цвет;

WORD bmBitsPixel – количество бит для кодирования цвета точки;

LPVOID bmBits – указатель на двухмерный массив данных, каждая строка которого соответствует одной строке изображения.

Используются монохромный и цветной типы образов. В случае монохромного – одноцветовой план и один бит на точку, единичное значение этого бита задает для точки цвет переднего плана (foreground), нулевое – заднего (backgroung).

Битовые образы – объекты, идентифицирующиеся их описателями – HBITMAP. Различают совместимые и контекстно-незави­си­мые объекты BITMAP.

Функции

HBITMAP CreateBitmap (int nWidth, int nHeight, UINT cPlanes,

UINT cBitsPerPel, const void* lpvBits);

HBITMAP CreateBitmapIndirect (const BITMAP* lpBitmap);

создают объект BITMAP с указанными характеристиками, возвращаемое значение – описатель объекта или NULL в случае ошибки; параметры:

nWidth, nHeight – размеры образа в точках изображения;

cPlanes – количество цветовых планов;

cBitsPerPel – «глубина» цвета;

lpvBits – массив данных образа;

lpBitmap – структура BITMAP, содержащая перечисленные параметры.

Функция

HBITMAP CreateCompatibleBitmap (hdc, int nWidth, int nHeight);

создает объект BITMAP совместимого типа для заданного контекста с заданными размерами; в зависимости от контекста он может быть создан цветным или монохромным (если в контексте заданы данные раздела DIB – контекстно-независимым); возвращаемое значение – описатель объекта или NULL; nWidth и nHeight – размеры образа.

Для доступа к содержимому битового образа предусмотрены функции SetDlBits () и GetDlBits (), которые работают построчно, однако имеется возможность воздействовать на него всеми доступными инструментами. Для этого объект BITMAP связывается с некоторым контекстом с помощью универсальной функции SelectObject (), после чего все изменения в контексте будут отображаться и в битовом образе.

Функции:

BOOL BitBlt (HDC hDstDC, int nDstX, int nDstY, int nDstWidth,

int nDstHeight,HDC hSrcDC, int nSrcX, int nSrcY, DWORD dwRop);

BOOL StretchBlt (HDC hDstDC, int nDstX, int nDstY, int nDstWidth,

int nDstHeight, HDC hSrcDC, int nSrcX, int nSrcY, int nSrcWidth,

int nSrcHeight, DWORD dwRop);

BOOL MaskBlt (HDC hDstDC, int nDstX, int nDstY, int nDstWidth,

int nDstHeight, HDC hSrcDC, int nSrcX, int nSrcY,

HBITMAP hbmMask, int nMaskX, int nMaskY, DWORD dwRop);

BOOL PlgBlt (HDC hDstDC, const POINT* lpDstVertices, HDC hSrcDC,

int nSrcX, int nSrcY, HBITMAP hbmMask, int nMaskX, int nMaskY,

DWORD dwRop);

выполняют перенос прямоугольного фрагмента изображения из контекста-источника в контекст-приемник (с трансформацией и дополнительными операциями). Функция StretchBlt может изменять масштаб изображения фрагмента; MaskBlt позволяет маскировать часть изображения; PlgBlt осуществляет перенос в непрямоугольную область приемника с соответствующим искажением; возвращаемое значение – признак успешности выполнения; параметры:

hSrcDC, hDstDC – контексты источника и приемника данных;

nSrcX, nSrcY, nDstX, nDstY – координаты фрагмента в обоих контекстах;

nSrcWidth, nSrcHeight, nDstWidth, nDstHeight – размеры фрагментов;

hbmMask – битовый образ маски, монохромного типа, нулевые точки маски указывают на применение к данной точке изображения операции «заднего плана», единичные – «переднего плана»;

nMaskX, nMaskY – точка привязки в образе маски;

lpDstVertices – массив структур, задающих вершины параллелограмма, образующего фрагмент-приемник;

dwRop – дополнительная операция, применяемая к фрагменту при переносе: SRCCOPY – простое копирование, SRCAND – комбинация цветов источника и приемника по «И», SRCPAINT – комбинация по «ИЛИ», SRCIN­VERT – комбинация по «исключающему ИЛИ», SRCERASE – комбинация по «И» цвета источника и инверсии цвета приемника, NOTSRCCOPY, NOT­SRCERASE – соответствует одноименным, но результирующий цвет инвертируется, DSTINVERT – инверсия фрагмента-приемника, BLACK­NESS, WHITE­NESS – заполнение фрагмента-получателя цветом соответственно 0 и 1 физической палитры и другие. Для MaskBlt параметр включает операции для переднего и заднего фонов, формируется с помощью макроса MAKEROP 4.

Для успешного применения этих функций требуется, чтобы оба контекста относились к одному устройству или идентичным устройствам.

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

Эффекты, возникающие при деформации битового образа, дополните­льно управляются функцией SetStretchBltMode, текущая настойка – GetStretchBltMode.

 

ЗАДАНИЕ 11. Создание графических изображений

1. Написать программу, которая выводит на экран флаг олимпийских игр (круги разных цветов).

2. Написать программу, которая, используя метод базовой точки, выводит на экран изображение кораблика.

3. Написать программу, которая вычерчивает на экране узор из 100 окружностей случайного диаметра и цвета.

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

5. Написать программу, которая выводит на экран контур пятиконечной звезды.

6. Написать программу, которая рисует флаг Республики Беларусь.


 

7. Написать программу, которая выводит на экран изображение шахматной доски.

8. Написать программу, которая рисует на экране раскрытую книгу.

9. Написать программу, которая выводит на экран оцифрованную координатную сетку.

10. Написать программу, которая выводит на экран точечный график функции y = 0,5 x 2 + 4 x – 3. Диапазон изменения аргумента от -15 до 5 с шагом 0,1. График вывести на фоне координатных осей, точка пересечения которых лежит в центре экрана.

 


ЛИТЕРАТУРА

 

1. Аксенкин, М. А. Язык С / М. А. Аксенкин, О. Н. Целобенок. – Минск: Унiверсiтэцкае, 1995.

2. Архангельский, А. Я. Программирование в С++ Builder 6 / А. Я. Архангельский. – М.: ЗАО «Издательство БИНОМ», 2002.

3. Березин, Б. И. Начальный курс С и С++ / Б. И. Березин, С. Б. Березин. – М.: Диалог– МРТИ, 1999.

4. Берри, В. Язык Си: введение для программистов / В. Берри, Б. Микинз. – М.: Финансы и статистика, 1988.

5. Больски, М. Н. Язык программирования Си: справочник / М. Н. Больски. – М.: Радио и связь, 1988.

6. Программирование: лаб. практикум для студ. 1–2-го курсов всех спец. БГУИР и всех форм обуч. Ч.2. Основы программирования на алгоритмическом языке С / В. Л. Бусько [и др.]. – Минск: БГУИР, 2005.

7. Основы алгоритмизации и программирования: конспект лекций для студ. всех спец. и всех форм обуч. БГУИР / В. Л. Бусько [и др.]. – Минск: БГУИР, 2004.

8. Бухтияров, А. М. Сборник задач по программированию на алгоритмических языках / А. М. Бухтияров, Г. Д. Фролов. – М.: Статистика, 1978.

9. Бабэ, Б. Просто и ясно о Borland C++ / Б. Бабэ. – М.: БИНОМ, 1995.

10. Бадд, Т. Объектно-ориентированное программирование в действии / Т. Бадд. – СПб.: Питер, 1997.

11. Вайнер, Р. С++ изнутри / Р. Вайнер, Л. Пинсон – Киев: ДиаСофт, 1993.

12. Вирт, Н. Алгоритмы и структуры данных / Н. Вирт. – СПб.: Невский диалект, 2001.

13. Вирт, Н. Алгоритмы + структуры данных = программы / Н. Вирт. – М.: Мир, 1985.

14. Дейтел, Х. М. Как программировать на С / Х. М. Дейтел, П. Дж. Дейтел. – М.: БИНОМ, 2006.

15. Демидович, Е. М. Основы алгоритмизации и программирования. Язык Си / Е. М. Демидович. – Минск: Бест­принт, 2001.

16. Джехани, Н. Программирование на языке Си / Н. Джехани // Радио и связь, 1988.

17. Дэвис, С. С++ для «чайников» / С. Дэвис. – Киев: Диалектика, 1996.

18. Касаткин, А. И. Профессиональное программирование на языке Си: Oт Turbo-C к Borland C++: справ.пособие / А. И. Касаткин, А. Н. Вольвачев. – Минск: Выш. шк., 1992.

19. Касаткин, А. И. Профессиональное программирование на языке Си. Управление ресурсами: справ.пособие / А. И. Касаткин. – Минск: Выш.шк., 1992.

20. Керниган, Б. Язык программирования Си / Б. Керниган, Д. Ритчи. – М.: Финансы и статистика, 1992.

21. Керниган, Б. Язык программирования Си. Задачи по языку Си / Б. Керниган, Д. Ритчи, А. Фьюэр. – М.: Финансы и статистика, 1985.

22. Керниган, Б. Универсальная среда программирования UNIX / Б. Керниган, Р. Пайк. – М.: Финансы и статистика, 1992.

23. Климова, Л. И. С++. Практическое программирование / Л. И. Климова. – М.: Кудиц-Образ, 2001.

24. Кнут, Д. Искусство программирования: т. 1–3. Основные алгоритмы / Д. Кнут. – М.: Издательский дом «Вильямс», 2004.

25. Котлинская, Г. П. Программирование на языке Си / Г. П. Котлинская, О. И. Галиновский. – Минск: Выш.шк., 1991.

26. Методы алгоритмизации / В. М. Котов [и др.]. – Минск: Народная асвета, 1996.

27. Котов, В. М. Методы алгоритмизации: учеб. пособие / В. М. Котов, О. И. Мельников. – Минск: Народная асвета, 2000.

28. Котов, В. М. Структуры данных и алгоритмы: учеб. пособие / В. М. Котов, Е. П. Соболевская. – Минск: БГУ, 1996.

29. Программирование на С и С++ / А. В. Крячков [и др.]. – М.: Горячая линия – Телеком, 2000.

30. Морозов, А. А. Структуры данных и алгоритмы: учеб. пособие: в 2 ч. / А. А. Морозов. – Минск: БГПУ им. М. Танка. Ч. 1. – 2000, Ч. 2. – 2001.

31. Павловская, Т. А. С/С++. Программирование на языке высокого уровня / Т. А. Павловская. – СПб.: Питер, 2004.

32. Павловская, Т. А. С/С++. Структурное программирование: Практикум / Т. А. Павловская, Ю. А. Щупак. – СПб.: Питер, 2002.

33. Павловская, Т. А. С++. Объектно-ориентированное программирование: практикум / Т. А. Павловская, Ю. А. Щупак. – СПб.: Питер, 2004.

34. Петзольд, Ч. Программирование для Windows 95 / Ч. Петзольд. – BHV.: СПб.: БИНОМ, 1997.

35. Подбельский, В. В. Программирование на языке Си / В. В. Подбельский, С. С. Фомин. – М.: Финансы и статистика, 2001.

36. Подбельский, В. В. Язык С++ / В. В. Подбельский. – M.: ФиС, 2001.

37. Пол, И. Объектно-ориентированное программирование с использованием С++ / И. Пол. – Киев: ДиаСофт, 1995.

38. Романовская, Л. М. Программирование в среде СИ для ПЭВМ ЕС / Л. М. Романовская, Т. В. Русс, С. Г. Свитковский. – М.: Финансы и статистика, 1992.

39. Практикум по программированию на алгоритмических языках /
Г. И. Светозарова [и др.]. – М.: Наука, 1980.

40. Синицын, А. К. Конспект лекций по курсу «Программирование» для студ. 1–2-го курсов всех спец. БГУИР / А. К. Синицын. – Минск: БГУИР, 2001.

41. Синицын, А. К. Программирование алгориттмов в среде Builder C++: лаб.практикум по курсам «Программирование» и «Основы алгоритмизации и программирование» для студ. 1-2 курсов всех спец. БГУИР дневн.
и веч. форм обуч.: в 2 ч. / А. К. Синицын. – Минск: БГУИР. Ч. 1. – 2004, Ч. 2. – 2005.

42. Страуструп, Б. Язык программирования С++ / Б. Страуструп. – СПб.: БИНОМ, 1999.

43. Тимофеев, В. В. Программирование в среде С++ Builder 5 / В. В. Тимофеев. – М.: БИНОМ, 2000.

44. Топп, У. Структуры данных в С++: пер. с англ. / У. Топп, У. Форд. – М.: ЗАО «Издательство БИНОМ», 2000.

45. Уингер, Р. Язык Турбо Си / Р. Уингер. – М.: Мир, 1991.

46. Успенский, В. А. Теория алгоритмов: основные открытия и приложения / В. А. Успенский, А. А. Семенов. – М., 1987.

47. Уэйт, М. Язык Си. Руководство для начинающих / М. Уэйт, С. Прама, Д. Мартин. – М.: Мир, 1988.

48. Фьюэр, А. Задачи по языку Си / А. Фьюэр. – М.: Финансы и статистика, 1985.

49. Холзнер, С. Visual C++ 6. Учебный курс / С. Холзнер. – СПб.: Питер, 1999.

50. Хэнкок, Л. Введение в программирование на языке Си / Л. Хэнкок, М. Кригер. – М.: Радио и связь,1986.

51. Шилд, Г. Программирование на Borland С++ / Г. Шилд. – Минск: ПОПУРРИ, 1999.

52. Юлин, В. А. Приглашение к Си / В. А. Юлин, И. Р. Булатова. – Минск: Выш.шк., 1990.

 


 

 

Учебное издание

 

 

Батура Михаил Павлович

Бусько Виталий Леонидович

Корбит Анатолий Григорьевич

Кривоносова Татьяна Михайловна

 

 

 

 



Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 584; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.88.114.76 (0.081 с.)