47952 (597372), страница 9

Файл №597372 47952 (Основы графического вывода) 9 страница47952 (597372) страница 92016-07-30СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 9)

lpfnDdaPrc — указатель на процедуру типа LINEDDAPROC

lParam — данные, передаваемые пользователем процедуре LINEDDAPROC

Вызываемая процедура LINEDDAPROC имеет следующий вид:

void CALLBACK LineDDAproc (nX, nY, lParam) {

// ...}

Процедура LineDDAproc получает координаты точки, которую надо нарисовать и данные, переданные пользователем.

Координаты первой и последней точек задаются в произвольных единицах, так как их использование определяется не процедурой LineDDA, а процедурой LineDDAproc, разрабатываемой вами. Какие координаты вам удобнее — такие и используйте. Адрес процедуры lpfnDdaPrc в случае Windows API является адресом, возвращаемом функцией MakeProcInstance, но не адресом самой процедуры (об этом подробнее — в разделе «диспетчер памяти »). Данные, передаваемые пользователем, (lParam) являются двойным словом. В документации утверждается, что это дальний указатель на данные, хотя это некорректное утверждение. Часто параметр в виде двойного слова используется для задания адреса каких–либо данных (особенно, если данные занимают больше двух слов), однако реально там может удерживаться произвольное 32х разрядное число. Более того, в прототипе функции он описан именно как long.

Рисование заполненных фигур

Следующая группа функций предназначена для отображения заполненных фигур. К таким фигурам относятся прямоугольники, прямоугольники со скругленными краями, эллипсы, сектора, дуги, стянутые хордой и многоугольники. Условно можно представить себе рисование заполненных фигур как процесс, состоящий из двух этапов — рисование контура текущим пером и заполнение фона. При рисовании контура справедливы все замечания, сделанные при обсуждении рисования линий. Если вам не надо рисовать контур, то выберите в контекст устройства прозрачный карандаш (функция GetStockObject или макрос GetStockPen, NULL_PEN). При заполнении фона рисуемой фигуры используются как уже рассмотренные атрибуты GDI, так и несколько новых. Естественно, что перед рисованием нужной вам фигуры вы должны установить требуемые значения атрибутов контекста устройства.

Кисть (Brush).

Кисть используется как для закраски внутренней области замкнутых фигур, так и для закраски внутренней области окна. Если фон фигуры заполнять не надо, то установите прозрачную кисть. Фактически кисть представляет собой маленький, 8x8 пиксель битмап, который многократно повторяется при заполнении указанной области. Кисть может быть как однотонной (все точки кисти имеют одинаковый цвет), так и штрихованной или узорчатой. Для штрихованных кистей определяется только цвет штрихов; цвет промежутков между штрихами определяется непосредственно при закраске области.

Цвет фона (Background Color).

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

Режим заполнения фона (Background Mode).

Определяет, надо–ли закрашивать промежутки между линиями штрихованных кистей цветом фона или оставить фон без изменений.

Режим рисования (Drawing Mode).

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

Направление рисования эллипсов (Arc Direction).

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

Режим заполнения многоугольников (Polygon Filling Mode).

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

Большинство перечисленных здесь атрибутов GDI уже рассмотрено в разделе «Рисование линий», так что повторно обсуждаться они не будут. Ниже отдельно вынесено обсуждение двух новых атрибутов: кисть и режим заполнения многоугольников.

Функции для рисования заполненных фигур

Среди всех функций, рисующих заполненные объекты, можно условно выделить группу функций, для выполнения которых вы должны задать описывающий рисуемый объект прямоугольник. К таким функциям относятся функции по рисованию прямоугольника (Rectangle), прямоугольника со скругленными краями (RoundRect), эллипса (Ellipse), а также функции для рисования сектора (Pie) и дуги, стянутой хордой (Chord). Все эти функции требуют задания либо непосредственно рисуемого прямоугольника, либо прямоугольника, в который будет вписан рисуемый объект (прямоугольник со скругленными углами, весь рисуемый эллипс или эллипс, дуга которого используется для рисования сектора или стягивается хордой).

При задании описывающего прямоугольника необходимо учитывать несколько нюансов:

Во–первых, по умолчанию нижняя и правая границы описывающего прямоугольника не включаются в рисуемый объект, однако в случае Win32 API и установленного расширенного режима границы описывающего прямоугольника полностью включаются в рисуемый объект (функция SetGraphicsMode, GM_ADVANCED, дополнительно см. раздел «Глобальные системы координат GDI (Win32 API)»).

Во–вторых, рисуемый объект может выходить за рамки описывающего прямоугольника, если для обведения контура используется перо, ширина которого превышает одну единицу устройства и это перо не стиля PS_INSIDEFRAME. Линия стиля PS_INSIDEFRAME всегда будет находиться внутри описывающего прямоугольника.

В–третьих, ориентация сторон описывающего прямоугольника всегда параллельна осям координат и, соответственно, предусмотренные функции не могут рисовать наклонных прямоугольников и эллипсов, что является существенным неудобством. Единственное возможность — при использовании Win32 API перейти в расширенный режим и наклонить сами оси координат (см. раздел «Глобальные системы координат GDI (Win32 API)»).

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

BOOL Rectangle (hDC, xLeft, yTop, xRight, yBottom);

BOOL Ellipse (hDC, xLeft, yTop, xRight, yBottom);

BOOL RoundRect (hDC, xLeft, yTop, xRight, yBottom, xRound, yRound);

Функция Rectangle рисует прямоугольник с прямыми углами, а функция RoundRect скругляет эти углы, проводя небольшие дуги. Эти функции используют описывающий прямоугольник, координаты которого задаются в качестве параметров, причем для функций Rectangle и RoundRect этот прямоугольник задает непосредственно рисуемый объект, а для функции Ellipse он задает описывающий прямоугольник. Функция RoundRect дополнительно требует задания величины эллипсов, которыми она будет скруглять углы. При этом надо учитывать, что задаются размеры описывающего скругляющий эллипс прямоугольника, а не его радиусы. То есть в каждом углу скругляющая дуга будет занимать только половину от указанных вами значений.

Рисунок 7. Задание величины скругляющих эллипсов для функции RoundRect.

Теперь осталось рассмотреть пару функция для рисования сектора (Pie), то есть дуги и области, ограниченной двумя радиусами и для рисования дуги, стянутой хордой (Chord).

Рисунок 8. Результат выполнения функций Pie (слева) и Chord (справа).

BOOL Pie (hDC, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

BOOL Chord (hDC, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

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

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

BOOL Polygon (hDC, lpPoints, nCount);

BOOL PolyPolygon (hDC, lpPoints, lpCounts, nPolyCount);

Функция Polygon рисует текущим карандашом ломаную линию, имеющую указанное параметром nCount число точек с координатами, заданными массивом структур типа POINT, который задается параметром lpPoints (аналогично функции PolyLine — см. раздел «Рисование линий»). В отличие от PolyLine, функция Polygon замыкает многоугольник и закрашивает его внутреннюю область текущей кистью. Так как многоугольник может быть достаточно сложным, и некоторые его области могут перекрываться, то GDI предусматривает два различных алгоритма вычисления внутренней, закрашиваемой области. Применяемый алгоритм определяется атрибутом контекста устройства, называемым режим заполнения многоугольников (polygon filling mode) — см. ниже.

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

Кисть

В Windows существует специальный объект GDI, используемый для закраски внутренних областей фигур; по аналогии с рисованием на бумаге этот объект получил название кисть (brush). Практически кисть представляет собой небольшую (8x8 пикселей) картинку, которая многократно воспроизводится для закраски указанной области.

Кисть является объектом GDI и, соответственно, при работе с ней надо придерживаться общих правил работы с объектами GDI.

Windows содержит несколько стандартных кистей, для выбора которых можно воспользоваться функцией:

HANDLE GetStockObject (nIndex);

HBRUSH GetStockBrush (nIndex); 2

где параметр nIndex может быть:

BLACK_BRUSH

— кисть черного цвета

DKGRAY_BRUSH

— темно-серая

GRAY_BRUSH

— серая

LTGRAY_BRUSH

— светло-серая

WHITE_BRUSH

— белая

HOLLOW_BRUSH

— прозрачная кисть

NULL_BRUSH

— прозрачная кисть (синоним символа HOLLOW_BRUSH)

Белая кисть (WHITE_BRUSH) обычно используется для закраски фона окна (при описании класса окна поле WNDCLASS.hbrBackground задается обычно равным хендлу белой кисти).

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

UINT SetClassWord (hWnd, GCW_HBRBACKGROUND, hbrNewBrush); // Windows 3.x

DWORD SetClassLong (hWnd, GCL_HBRBACKGROUND, hbrNewBrush); // Win32 API

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

Кисти HOLLOW_BRUSH и NULL_BRUSH представляют один и тот же объект — прозрачную кисть. Вы можете использовать данную кисть для закраски фона замкнутых фигур, если они должны быть представлены только контуром, без заполнения внутренней области.

Если вы хотите создать собственную кисть, то можно воспользоваться одной из следующих функций:

HBRUSH CreateSolidBrush (crColor);

HBRUSH CreateHatchBrush (nStyle, crColor);

HBRUSH CreatePatternBrush (hBitmap);

HBRUSH CreateDIBPatternBrush (hGlobDIB, nColorSpec);

HBRUSH CreateBrushIndirect (lpLogBrush);

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

Так, например, в 16ти цветном режиме стандартные кисти LTGRAY_BRUSH, GRAY_BRUSH и BLACK_BRUSH могут быть представлены оттенками серого цвета, а кисть DKGRAY_BRUSH будет представлена смесью точек серого и черного цветов.

Функция CreateHatchBrush создает штрихованную кисть. Вы указываете два параметра — тип штриховки (nStyle) и цвет штриха (crColor), для закраски фона между штрихами в качестве фона используются атрибуты контекста устройства текущий цвет фона и режим заполнения фона.

Рисунок 9. Стили штрихованных кистей

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

COLORREF SetBkColor (hDC, crColor);

int SetBkMode (hDC, nMode);

С помощью функций CreatePatternBrush и CreateDIBPatternBrush вы можете описать кисть, определяемую образцом (pattern) — рисунком размером 8x8 пикселей. Для этого надо предварительно получить битмап размером 8x8 пикселей (или больше) и передать его соответствующей функции. Кисть будет создана исходя по изображению размером 8x8 пикселей, находящемуся в верхнем–левом углу битмапа. Подробнее о получении битмапов — смотри в разделе “Растровые изображения”. Все время, пока существует кисть, вы должны сохранять исходный битмап, по которому эта кисть построена. Один битмап может применяться для создания многих кистей.

Разница между двумя функциями создания кисти по образцу связана с применением разных видов битмапов — зависимых от устройства (DDBdevice depended bitmap) и независимых от устройства (DIBdevice independed bitmap). Независимый от устройства битмап содержит как данные об изображении, так и данные о применяемых цветах (палитре). При создании кисти на основе DIB требуется два параметра, один из которых указывает образец (независимый от устройства битмап), а другой указывает правила интерпретации логических цветов данного битмапа.

К этим двум функциям создания кисти по образцу надо сделать еще одно замечание: если битмап является монохромным, то тогда GDI будет представлять его не в виде черно–белого изображения, а использовать текущий цвет текста вместо цвета (1) и текущий цвет фона вместо цвета (0). Таким образом картинка оказывается как–бы негативной — точки, кодированные 1, по умолчанию представляются черными (цвет текста), а 0 — белыми (цвет фона).

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

typedef struct tagLOGBRUSH {

Характеристики

Тип файла
Документ
Размер
4,85 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7027
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее