Графический интерфейс GDI в Microsoft Windows (2)

         

Основные понятия


Введение
ВведениеПредыдущие три тома "Библиотеки системного программиста" представляли собой краткое (!) введение в программирование для операционной системы Microsoft Windows. В них мы рассказал...
1 Основные понятия
1. Основные понятия1.1. Контекст отображения1.2. Инструменты для рисованияИнтерфейс графических устройств GDI операционной системы Microsoft Windows (в дальнейшем - просто GDI), как это можно пред...
1 1 Контекст отображения
1.1. Контекст отображенияИтак, займемся описанием "листа бумаги", на "поверхности" которого выполняется рисование графических изображений и текста - контекста отображения. Преж...
Рис 1 1 Вывод данных через контекст устройства
Рис 1.1. Вывод данных через контекст устройстваЕсли приложение получает или создает контекст для устройства отображения, такой контекст называется контекстом отображения. Поэтому когда, например,...
Атрибуты контекста отображения
Атрибуты контекста отображенияВ документации, которая поставляется в составе Microsoft SDK, описаны 20 атрибутов контекста отображения . Несколько атрибутов описывают систему координат, используем...
Цвет фона
Цвет фонаПродолжая аналогию между контекстом отображения и листом бумаги, на котором рисуются графические изображения и пишется текст, можно сказать, что атрибут цвета фона (background color ) в к...
Режим фона
Режим фонаВы можете установить два режима фона (background mode ) - непрозрачный (OPAQUE ) и прозрачный (TRANSPARENT ), вызвав функцию SetBkMode. По умолчанию выбран режим непрозрачного отображени...
Режим рисования


Режим рисованияКогда вы рисуете что-нибудь на бумаге обычным карандашом или фломастером, цвет получившегося изображения соответствует цвету выбранного вами карандаша или фломастера. Иными словами,...
Цвет текста
Цвет текстаПо умолчанию в контексте отображения для вывода текста выбран черный цвет. Поэтому, если вы не изменили ни одного атрибута контекста отображения, связанного с текстом и цветом, такие фу...
Шрифт
ШрифтКонтекст отображения содержит информацию о том, какой шрифт (font ) используется для вывода текста. По умолчанию текст выводится системным шрифтом с переменной шириной букв в кодировке ANSI....
Расстояние между буквами
Расстояние между буквамиПо умолчанию при выводе текста расстояние между буквами (intercharacter spacing ), заданное в контексте отображения, равно 0. Для вывода текста "вразрядку" прилож...
Цветовая палитра
Цветовая палитраЦветовая палитра (color palette ) - это таблица цветов. Некоторые устройства отображения способны работать с десятками тысяч цветов, однако из-за ограничений аппаратуры в них можно...
Кисть
КистьДля закрашивания внутренней области окна приложения или замкнутой геометрической фигуры можно использовать не только различные цвета, но и графические изображения небольшого (8х8 пикселов) ра...
Начальные координаты кисти
Начальные координаты кистиНачальные координаты кисти (brush origin ) используются для определения координат точки внутри кисти, которая будет служить начальной при закраске внутренней области фигу...
Режим закрашивания многоугольников
Режим закрашивания многоугольниковСуществует два режима закрашивания сложных самопересекающихся многоугольников (polygon-filling mode ): альтернативный (ALTERNATE ), выбранный в контекст отображен...
Перо
ПероДля того чтобы нарисовать линию или геометрическую фигуру, приложение Windows должно создать собственное перо (pen ) или воспользоваться пером, выбранным в контекст отображения по умолчанию (ч...
Текущая позиция пера
Текущая позиция пераДля рисования линий в интерфейсе GDI предназначена функция LineTo, которая использует понятие текущей позиции пера (current pen position ). Функция LineTo рисует линию из точки...
Изображение bitmap
Изображение bitmapВ контекст отображения можно выбрать изображение bitmap и затем отобразить его в окне или использовать в меню. Мы будем обсуждать изображения bitmap в отдельной главе этого тома....
Режим растяжения
Режим растяженияПриложение Windows может копировать прямоугольные участки изображений bitmap, выполняя при этом масштабирование, т. е. сжатие или растяжение. Для такого копирования может быть испо...
Область ограничения
Область ограниченияПо умолчанию в контексте отображения задана область ограничения вывода (clipping region ), совпадающая со всей областью вывода. Например, если приложение получило контекст отобр...
Режим отображения
Режим отображенияРежим отображения, установленный в контексте отображения, влияет на систему координат. Устанавливая различные режимы отображения , приложение может изменять направление и масштаб...
Начало системы координат для окна
Начало системы координат для окнаВ контексте отображения хранится информация о расположении начала системы координат для окна и для физического устройства отображения. Эта информация используется...
Начало системы физических координат
Начало системы физических координатНачало системы физических координат (viewport origin ) относится не к окну приложения, а к физическому устройству вывода (например, ко всему экрану монитора) и и...
Масштаб осей для окна
Масштаб осей для окнаДля некоторых режимов отображения приложение может изменять масштаб осей в окне (window extent ), устанавливая для него новое значение в контексте отображения. По умолчанию ис...
Масштаб осей физических координат
Масштаб осей физических координатКонтекст отображения содержит масштаб осей для физического устройства (viewport extent ), который вместе с масштабом осей в окне используется в процессе преобразов...
1 2 Инструменты для рисования
1.2. Инструменты для рисованияИтак, теперь у вас есть представление о том, какая "бумага" используется для рисования. Вы смогли убедиться, что ее свойства намного богаче свойств обычной...
Перья
ПерьяПерья используются для рисования линий и простейших геометрических фигур. Приложение может выбрать одно из трех предопределенных перьев, либо создать собственное, выбрав нужный цвет и стиль....
Рис 1 2 Линии разной ширины нарисованные с использованием различных стилей
Рис 1.2. Линии разной ширины, нарисованные с использованием различных стилейКак мы уже говорили, интерфейс GDI операционной системы Windows версии 3.1 позволяет рисовать сплошные линии различной ш...
Рис 1 3 Геометрические фигуры нарисованные с использованием различных перьев
Рис 1.3. Геометрические фигуры, нарисованные с использованием различных перьев...
Кисти
КистиВнутренняя область окна и замкнутых геометрических фигур может быть закрашена при помощи кисти. С помощью функции GetStockObject можно выбрать черную, белую, темно- или светло-серую кисть или...
Рис 1 4 Геометрические фигуры закрашенные с использованием встроенных кистей
Рис 1.4. Геометрические фигуры, закрашенные с использованием встроенных кистейЕсли вас не устраивает ни одна из встроенных кистей, вы можете создать собственную, определив ее как изображение bitma...
Шрифты
ШрифтыДля того чтобы рисовать текст, используются шрифты . Как мы уже говорили в предыдущих томах "Библиотеки системного программиста", операционная система Windows версии 3.1 может рабо...
Рис 1 5 иллюстрирует ухудшение
Рис 1.5 иллюстрирует ухудшение внешнего вида растрового и векторного шрифтов при увеличении размера букв до величины 40 пунктов. Внешний вид масштабируемого шрифта не ухудшился....
Рис 1 5 Растровый векторный и
Битовые изображенияЕсли вам нужно вывести на экран сложное изображение, полученное при помощи сканера и содержащее множество мелких деталей, едва ли имеет смысл рисовать его при помощи перьев и ки...
2 Работа с контекстом отображения
2. Работа с контекстом отображения2.1. Получение и освобождение контекста отображения2.2. Выбор режима отображения2.3. Рисование геометрических фигур2.4. Приложение LINER2.5. Области2.6. Приложени...
2 1 Получение и освобождение контекста отображения
2.1. Получение и освобождение контекста отображения Способы получения (и, соответственно, освобождения) контекста отображения разные для контекстов разного типа. Можно выделить следующие типы конт...
Общий контекст отображения
Общий контекст отображенияЭтот контекст используется чаще всего и поэтому для ускорения доступа к нему Windows использует кеширование (как мы уже говорили, размер кеша достаточен для хранения толь...
Контекст отображения для класса окна
Контекст отображения для класса окнаОбщий контекст отображения , описанный нами в предыдущем разделе, кешируется операционной системой Windows для ускорения доступа к нему. Однако вы можете создат...
Личный контекст отображения
Личный контекст отображенияУказав в стиле класса окна значение CS_OWNDC , можно добиться того, что для каждого окна, созданного на базе такого класса, Windows создаст отдельную структуру контекста...
Родительский контекст отображения
Родительский контекст отображенияРодительский контекст отображения используется для дочерних окон. Он позволяет дочерним окнам "унаследовать" атрибуты контекста отображения у родительско...
Контекст отображения для окна
Контекст отображения для окнаВсе описанные выше контексты отображения позволяют рисовать только во внутренней области окна (client region). С помощью функции GetWindowDC приложение может получить...
Контекст физического устройства
Контекст физического устройстваВывод изображений на такое устройство, как принтер, может выполняться с использованием тех же приемов, что и вывод в окно приложения. Прежде всего необходимо получит...
Контекст для устройства DISPLAY
Контекст для устройства DISPLAYВ некоторых случаях требуется получить контекст отображения, позволяющий приложению рисовать в любом месте экрана дисплея. Такой контекст можно создать при помощи фу...
Информационный контекст
Информационный контекстЕсли приложению необходимо получить информацию об устройстве вывода (например, с помощью функции GetDeviceCaps, рассмотренной нами в 11 томе "Библиотеки системного прог...
Контекст для памяти
Контекст для памятиВ работе с битовыми изображениями bitmap часто используется такое "устройство вывода", как оперативная память. Приложение может полностью подготовить изображение в опе...
Контекст для метафайла
Контекст для метафайлаКонтекст для метафайла позволяет записывать команды GDI в файл и затем проигрывать такой файл на физическом устройстве вывода. Файл может находиться в памяти или на диске, в...
Функция GetDCEx
Функция GetDCExВ программном интерфейсе операционной системы Windows версии 3.1 появилась функция GetDCEx , предоставляющая расширенные возможности для получения контекста отображения: HDC WINAPI...
Таблица 1
Таблица 1КонстантаОписаниеDCX_WINDOW Функция возвращает контекст отображения, позволяющий рисовать во всем окне, а не только в его внутренней области DCX_CACHE Функция получает общий контекст отоб...
2 2 Выбор режима отображения
2.2. Выбор режима отображенияНапомним, что режим отображения - это атрибут контекста отображения, влияющий на используемую функциями GDI систему координат. Для обеспечения независимости приложений...
Основные определения
Основные определенияПрежде всего необходимо определить понятия "физические координаты " и "логические координаты ". Физические координаты, как это следует из названия, имеют не...
Физическая система координат
Физическая система координатНа Рисунок 2.1 показана физическая система координат для экрана видеомонитора....
Рис 2 1 Физическая система координат для экрана видеомонитора
Рис 2.1. Физическая система координат для экрана видеомонитораНачало этой системы координат располагается в левом верхнем углу экрана. Ось X направлена слева направо, ось Y - сверху вниз. В качест...
Таблица 2
Таблица 2Параметр функции GetDeviceCapsCGAEGAVGASVGA 800x 6008514/ASVGA 1024 x 768HORZRES64064064080010241024VERTRES200350480600760768HORZSIZE240240208208280208VERTSIZE1801751561522...
Логическая система координат
Логическая система координатПриложения Windows могут использовать одну из нескольких логических координат , устанавливая соответствующий режим отображения в контексте отображения. При этом, как мы...
Рис 2 2 Одна из возможных систем координат
Рис 2.2. Одна из возможных систем координатДля установки режима отображения, непосредственно определяющего направление осей и размер логической единицы системы координат, используется функция SetM...
Таблица 3
Таблица 3Режим отображенияНаправление оси X Направление оси YРазмер одной логической единицы MM_TEXT ВправоВниз 1 пикселMM_LOMETRIC ВправоВверх 0,1 ммMM_HIMETRIC ВправоВверх 0,01 ммMM_LOENGLISH Вп...
Преобразование координат
Преобразование координат Теперь немного математики (не волнуйтесь, совсем немного). Приложение, вызывая для рисования функции GDI, указывает логические координаты. Перед выводом GDI преобразует их...
Режимы отображения
Режимы отображенияТеперь, после того как мы рассказали о физических и логических координатах, а также о преобразованиях координат, займемся подробным описанием каждого режима отображения ....
Режим MM_TEXT
Режим MM_TEXTРежим отображения MM_TEXT устанавливается в контексте отображения по умолчанию. Для этого режима формулы преобразования координат упрощаются: xViewport = (xWindow - xWinOrg) + xViewOr...
Рис 2 3 Система координат в режиме отображения MM_TEXT
Рис 2.3. Система координат в режиме отображения MM_TEXTТак как в формуле преобразования не присутствуют переменные xViewExt, yViewExt, xWinExt и yWinExt, в данном режиме преобразования невозможно...
Метрические режимы отображения
Метрические режимы отображенияРежим MM_LOMETRIC , наряду с режимами MM_HIMETRIC , MM_LOENGLISH , MM_HIENGLISH и MM_TWIPS, относится к метрическим режимам. Эти режимы отображения позволяют использо...
Рис 2 4 Ориентация осей сразу после переключения в метрический режим отображения
Рис 2.4. Ориентация осей сразу после переключения в метрический режим отображенияОсь X, как и следовало ожидать, окажется направленной слева направо, а ось Y - снизу вверх. Точка с координатами (0...
Рис 2 5 Метрическая система координат начало координат находится в левом нижнем углу окна
Рис 2.5. Метрическая система координат, начало координат находится в левом нижнем углу окнаАналогичным образом можно расположить начало системы координат в середине окна (Рисунок 2.6), обеспечив в...
Рис 2 6 Метрическая система координат начало координат находится в центре окна
Рис 2.6. Метрическая система координат, начало координат находится в центре окна...
Режимы MM_ISOTROPIC и MM_ANISOTROPIC
Режимы MM_ISOTROPIC и MM_ANISOTROPICРежимы отображения MM_ISOTROPIC (изотропный) и MM_ANISOTROPIC (анизотропный) допускают изменение направления осей X и Y, а также изменение масштаба осей координ...
Рис 2 7 Изменение масштаба по горизонтали при увеличении ширины окна в изотропном режиме
Рис 2.7. Изменение масштаба по горизонтали при увеличении ширины окна в изотропном режимеЕсли же высота окна больше его ширины, при использовании изотропного режима отображения логическое окно ока...
Рис 2 8 Изменение масштаба по горизонтали при увеличении высоты окна в изотропном режиме
Рис 2.8. Изменение масштаба по горизонтали при увеличении высоты окна в изотропном режимеПри использовании анизотропного режима отображения MM_ANISOTROPIC настройка масштаба не выполняется, поэтом...
Рис 2 9 Изменение масштаба по горизонтали при увеличении ширины окна в анизотропном режиме
Рис 2.9. Изменение масштаба по горизонтали при увеличении ширины окна в анизотропном режиме...
Рис 2 10 Изменение масштаба по горизонтали при увеличении высоты окна в анизотропном режиме
Рис 2.10. Изменение масштаба по горизонтали при увеличении высоты окна в анизотропном режимеВ программном интерфейсе Windows версии 3.1 есть новые функции, предназначенные для изменения масштабов...
2 3 Рисование геометрических фигур
2.3. Рисование геометрических фигурВ этом разделе мы расскажем вам об использовании функций, предназначенных для рисования точек, линий, окружностей и других геометрических фигур. Несмотря на то,...
Таблица 4
Таблица 4Имя константыОписаниеLINECAPS Способности устройства рисовать линии. Возвращаемое значение представляет собой набор битовых масок, установленных в 1, если устройство может само рисовать л...
Рисование точки
Рисование точкиФункция рисования точки SetPixel устанавливает цвет точки с заданными координатами: COLORREF WINAPI SetPixel( HDC hdc, // контекст отображения int nXPos, // x-координата то...
Рисование линий
Рисование линий Приложения Windows могут рисовать прямые и ломаные линии, а также дуги эллипса (и окружности, как частного случая эллипса). Параметры этих линий определяются несколькими атрибутами...
Текущая позиция пера
Текущая позиция пераДля рисования прямых линий (и только для этого) в контексте отображения хранятся координаты текущей позиции пера . Для изменения текущей позиции пера в Windows версии 3.1 есть...
Рисование прямой линии
Рисование прямой линии Для того чтобы нарисовать прямую линию, приложение должно воспользоваться функцией LineTo : BOOL WINAPI LineTo(HDC hdc, int xEnd, int yEnd); Эта функция рисует линию из теку...
Рис 2 11 Рисование прямой линии
Рис 2.11. Рисование прямой линииЕсли вас не устраивает необходимость пользоваться двумя функциями для рисования линии, вы можете создать свою собственную, например такую: BOOL DrawLine(HDC hdc, in...
Рисование ломаной линии
Рисование ломаной линии Функции Polyline , предназначенной для рисования ломаных линий, следует передать идентификатор контекста отображения hdc, указатель lppt на массив структур POINT, в котором...
Рис 2 12 Рисование ломаной линии
Рис 2.12. Рисование ломаной линии...
Рисование дуги эллипса
Рисование дуги эллипса К сожалению, возможности рисования кривых линий при помощи функций GDI ограничены - единственная функция Arc позволяет нарисовать дугу эллипса или окружности: BOOL WINAPI Ar...
Рис 2 13 Рисование дуги эллипса
Рис 2.13. Рисование дуги эллипсаПараметры (nxLeft,nyTop) и (nxRight,nyBottom) задают координаты, соответственно, верхнего левого и правого нижнего углов воображаемого прямоугольника, в который впи...
Настройка атрибутов контекста отображения для рисования линий
Настройка атрибутов контекста отображения для рисования линий Как это нетрудно заметить, функции, предназначенные для рисования линий, не имеют никаких параметров, определяющих толщину, цвет и сти...
Выбор пера
Выбор пера Для рисования линий приложения Windows могут выбрать одно из трех встроенных перьев, либо создать собственное перо. Для выбора встроенного пера лучше всего воспользоваться макрокомандам...
Таблица 5
Таблица 5ЗначениеОписаниеBLACK_PEN Перо, рисующее черную линию толщиной в один пиксел (для любого режима отображения). Это перо выбрано в контекст отображения по умолчанию WHITE_PEN Перо белого цв...
Таблица 6
Таблица 6Стиль линииВнешний видОписаниеPS_SOLID...
Рис 2 14 Использование стилей PS_SOLID и PS_INSIDEFRAME
Рис 2.14. Использование стилей PS_SOLID и PS_INSIDEFRAME Еще одно отличие связано с использованием смешанных цветов (dithered color). Когда Windows не может в точности подобрать цвет, указанный дл...
Рис 2 15 Закругленные концы толстой линии
Рис 2.15. Закругленные концы толстой линииДля изображения толстой линии с прямыми концами следует задать прямоугольную область ограничения (см. ниже раздел, посвященный области ограничения). Можно...
Выбор режима фона
Выбор режима фонаРежим фона влияет на заполнение промежутков между штрихами и точками в штрих-пунктирных, штриховых и пунктирных линиях. Напомним, что по умолчанию в контексте отображения установл...
Рис 2 16 Режимы фона OPAQUE и TRANSPARENT
Рис 2.16. Режимы фона OPAQUE и TRANSPARENTДля установки режима фона предназначена функция SetBkMode : int WINAPI SetBkMode(HDC hdc, int fnBkMode); Эта функция устанавливает новый режим фона fnBkMo...
Выбор режима рисования
Выбор режима рисованияВозвращаясь к обычной бумаге и карандашу, отметим, что в процессе рисования графит (или иной материал) переносится с острия карандаша на поверхность бумаги. Цвет полученной л...
Таблица 7
Таблица 7Режим рисованияФормулаЦвет пикселаR2_COPYPEN PСоответствует (равен) цвету пера R2_BLACK 0Черный R2_WHITE 1Белый R2_NOP DНе меняется, т. е. перо ничего не рисует R2_NOT ~DПолучается инверт...
Рисование линий произвольного стиля
Рисование линий произвольного стиля Как мы уже говорили, вы не можете создать перо для рисования пунктирных, штрих-пунктирных или штриховых линий толщиной больше одного пиксела. Однако в некоторых...
Рисование замкнутых фигур
Рисование замкнутых фигурПомимо линий, приложения Windows могут использовать функции GDI для рисования замкнутых закрашенных или незакрашенных фигур, таких как прямоугольники, эллипсы, многоугольн...
Рисование прямоугольника
Рисование прямоугольника Простейшая функция, с помощью которой можно нарисовать прямоугольник, называется Rectangle : BOOL WINAPI Rectangle( HDC hdc, // идентификатор контекста отображения int...
Рис 2 17 Рисование прямоугольника
Рис 2.17. Рисование прямоугольникаКак видно из этого рисунка, последние четыре параметра функции задают координаты верхнего левого и нижнего правого угла прямоугольника. В зависимости от стиля пер...
Рис 2 18 Прямоугольник со скругленными углами
Рис 2.18. Прямоугольник со скругленными угламиПо сравнению с функцией Rectangle функция RoundRect имеет два дополнительных параметра nxEllipse и nyEllipse, определяющих форму и радиус закругления:...
Рисование эллипса
Рисование эллипсаДля рисования эллипса вы можете использовать функцию Ellipse : BOOL WINAPI Ellipse( HDC hdc, // идентификатор контекста отображения int nxTL, // координата x верхнего левого уг...
Рис 2 19 Рисование эллипса
Рис 2.19. Рисование эллипса...
Рисование сегмента эллипса
Рисование сегмента эллипса Сегмент эллипса (Рисунок 2.20) можно нарисовать при помощи функции Chord : BOOL WINAPI Chord( HDC hdc, // идентификатор контекста отображения int nxLeft, int nyTop,...
Рис 2 20 Рисование сегмента эллипса
Рис 2.20. Рисование сегмента эллипса...
Рисование сектора эллипса
Рисование сектора эллипса Для рисования сектора эллипса (Рисунок 2.21) следует использовать функцию Pie , аналогичную по своим параметрам функциям Arc и Chord: BOOL WINAPI Pie( HDC hdc, // идент...
Рис 2 21 Рисование сектора эллипса
Рис 2.21. Рисование сектора эллипса...
Рисование многоугольников
Рисование многоугольников Рисование многоугольников (Рисунок 2.22) выполняется функцией Polygon , аналогичной по своим параметрам функции Polyline, с помощью которой рисуются ломаные линии: BOOL W...
Рис 2 22 Рисование многоугольника
Рис 2.22. Рисование многоугольникаВ массиве структур POINT, определяющих вершины многоугольника, каждая вершина должна быть указана один раз. Функция Polygon автоматически замыкает ломаную линию,...
Выбор кисти
Выбор кистиДля закрашивания внутренней области замкнутых фигур вы можете использовать встроенные кисти, или кисти, созданные вашим приложением. Последние необходимо удалять после использования....
Использование встроенной кисти
Использование встроенной кистиДля выбора одной из встроенной кисти вы можете воспользоваться макрокомандой GetStockBrush , определенной в файле windowsx.h: #define GetStockBrush(i) ((HBRUSH)GetSto...
Таблица 8
Таблица 8ЗначениеОписаниеBLACK_BRUSH Кисть черного цвета WHITE_BRUSH Кисть белого цвета GRAY_BRUSH Серая кистьLTGRAY_BRUSH Светло-серая кисть DKGRAY_BRUSH Темно-серая кисть NULL_BRUSH Бесцветная к...
Создание кисти
Создание кисти Если вам нужна цветная кисть, ее следует создать с помощью функции CreateSolidBrush : HBRUSH WINAPI CreateSolidBrush(COLORREF clrref); В качестве параметра для этой функции необходи...
Таблица 9
Таблица 9Стиль штриховкиВнешний вид HS_BDIAGONAL...
Закрашивание внутренней области окна
Закрашивание внутренней области окнаНапомним, что кисть можно использовать еще и для закрашивания внутренней области окна . Для этого идентификатор кисти следует записать в поле hbrBackground стру...
Установка начальных координат кисти
Установка начальных координат кистиНачальные координаты кисти (brush origin ) - это атрибут контекста отображения. Он используются для определения координат точки внутри кисти, которая будет служи...
2 4 Приложение LINER
2.4. Приложение LINERДля демонстрации функций рисования графических изображений в различных режимах фона и с использованием различных растровых операций мы подготовили приложение LINER. Кроме всег...
Рис 2 23 Приложение LINER
Рис 2.23. Приложение LINERМеню "Draw" предназначено для выбора фигур, отображаемых в окне приложения. Вы можете выбрать прямые линии (строка "Lines"), ломаную линию (строка &qu...
Рис 2 24 Прозрачный режим фона
Рис 2.24. Прозрачный режим фонаПосмотрите, как отражается изменение фона на рисовании других фигур, например, прямых линий (Рисунок 2.25)....
Рис 2 25 Рисование прямых линий различной толщины и стиля
Рис 2.25. Рисование прямых линий различной толщины и стиляМеню "ROP" позволит вам провести эксперименты с различными растровыми операциями. Выбрав из меню "Draw" строку "P...
Рис 2 26 Режимы закрашивания многоугольников
Рис 2.26. Режимы закрашивания многоугольниковГлавный файл приложения LINER приведен в листинге 2.1. Листинг 2.1. Файл liner/liner.cpp // ---------------------------------------- // Приложение LIN...
2 5 Области
2.5. ОбластиВ интерфейсе GDI есть средства, позволяющие приложениям создавать области достаточно сложной формы из прямоугольных, многоугольных и эллиптических областей. Такие области можно закраши...
Создание области
Создание областиПриложение может создать область прямоугольной формы, область в виде многоугольника, область эллиптической формы. Можно комбинировать область из двух других, выполняя при этом над...
Прямоугольная область
Прямоугольная область Для создания прямоугольной области предназначены функции CreateRectRgn и CreateRectRgnIndirect : HRGN WINAPI CreateRectRgn( int nLeftRect, int nTopRect, int nRightRect, int...
Область в виде многоугольника
Область в виде многоугольникаМожно создать область в виде произвольного многоугольника. Для этого следует воспользоваться функцией CreatePolygonRgn : HRGN WINAPI CreatePolygonRgn( const POINT FAR...
Область эллиптической формы
Область эллиптической формыОбласть эллиптической формы (или, как частный случай, круглой формы) можно создать при помощи функции CreateEllipticRgn : HRGN WINAPI CreateEllipticRgn( int nLeftRect,...
Комбинирование областей
Комбинирование областей Функция CombineRegion позволяет вам изменить существующую область, скомбинировав ее из двух других: int WINAPI CombineRgn( HRGN hrgnDest, // новая область HRGN hrgnSrc1,...
Таблица 10
Таблица 10Значение параметра fnCombineModeСпособ образования области hrgnDest RGN_AND Пересечение областей hrgnSrc1 и hrgnSrc2 RGN_OR Объединение областей hrgnSrc1 и hrgnSrc2 RGN_XOR Объединение о...
Таблица 11
Таблица 11ЗначениеОписаниеERROR ОшибкаNULLREGION Новая область пустая SIMPLEREGION Новая область не является самопересекающейся (т. е. граница созданной области не пересекает саму себя) COMPLEXREG...
Перерисовка области
Перерисовка области Вы можете отметить область как требующую перерисовки, вызвав функцию InvalidateRgn . В результате этого приложению будет передано сообщение WM_PAINT . Приведем прототип функции...
Другие операции
Другие операцииДля изменения прямоугольной области можно воспользоваться функцией SetRectRgn , изменяющей координаты существующей прямоугольной области: void WINAPI SetRectRgn( HRGN hrgn, int nL...
Закрашивание области
Закрашивание области Для закрашивания области кистью, выбранной в контекст отображения, предназначена функция PaintRgn : BOOL WINAPI PaintRgn(HDC hdc, HRGN hrgn); Функция FillRgn также закрашивает...
Область ограничения
Область ограничения Приложение может использовать область для маски, ограничивающей вывод. Для этого область следует выбрать в контекст отображения функцией SelectClipRgn : int WINAPI SelectClipRg...
2 6 Приложение REGIONS
2.6. Приложение REGIONSДля демонстрации использования комбинированных областей мы подготовили приложение REGIONS. Это приложение создает три области: прямоугольную и две эллиптические разного разм...
Рис 2 27 Вывод текста с использованием области ограничения
Рис 2.27. Вывод текста с использованием области ограниченияИсходный текст приложения приведен в листинге 2.6. Листинг 2.6. Файл regions/regions.cpp // ---------------------------------------- //...
2 7 Сохранение и восстановление контекста отображения
2.7. Сохранение и восстановление контекста отображенияОбычно приложения настраивают атрибуты контекста отображения в обработчике сообщения WM_PAINT непосредственно перед началом рисования. Процесс...
2 8 Приложение DASHLINE
2.8. Приложение DASHLINEПриложение DASHLINE демонстрирует использование функции LineDDA для рисования пунктирных линий увеличенной толщины (Рисунок 2.28). Напомним, что вы не можете создать перо д...
Рис 2 28 Пунктирные линии увеличенной толщины
Рис 2.28. Пунктирные линии увеличенной толщиныОсновной файл исходного текста приложения приведен в листинге 2.8. Листинг 2.8. Файл dashline/dashline.cpp // ---------------------------------------...
4 Битовые изображения
4. Битовые изображения4.1. Битовые изображения в формате DDB4.2. Приложение BMPLOGO4.3. Битовые изображения в формате DIB4.4. Рисование изображений DIB4.5. Приложение BMPINFOВ этой главе мы расска...
4 1 Битовые изображения в формате DDB
4.1. Битовые изображения в формате DDB Как мы уже говорили, битовые изображения в формате DDB являются аппаратно-зависимыми. Поэтому структура изображения в оперативной памяти зависит от особеннос...
Загрузка изображений из ресурсов приложения
Загрузка изображений из ресурсов приложенияСамый простой способ использования битовых изображений в приложениях Windows заключается в том, что изображение создается графическим редактором в виде b...
Таблица 1
Таблица 1ПолеОписаниеbmTypeТип битового изображения. Должен быть равен 0 bmWidthШирина битового изображения в пикселах, должна быть больше 0 bmHeightВысота битового изображения в пикселах, должна...
Рис 4 1 Чернобелое битовое изображение
Рис 4.1. Черно-белое битовое изображениеЭтому представлению соответствует дамп памяти, представленный ниже: 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10: 00 00 00 00 00 00 00 00 00 00 00...
Рисование изображения DDB
Рисование изображения DDB Итак, мы загрузили битовое изображение в память и определили его параметры. Теперь наша задача заключается в том, чтобы нарисовать загруженное изображение в окне приложен...
Таблица 2
Таблица 2Код растровой операцииЛогическое выражение ОписаниеSRCCOPY SИсходное изображение копируется в контекст отображения SRCPAINT S | DЦвет полученного изображения определяется при помощи логич...
Создание изображений в памяти
Создание изображений в памяти Другой способ работы с изображениями в формате DDB заключается в создании их непосредственно в оперативной памяти. Вы должны подготовить массив, содержащий биты изобр...
Рис 4 2 Битовое изображение
Рис 4.2. Битовое изображениеПодготовим в памяти массив, описывающий это изображение. Каждая строка массива соответствует одной строке сканирования битового изображения: BYTE bBytes[] = { 0xff, 0x...
Другие функции для работы с изображениями DDB
Другие функции для работы с изображениями DDBЕсли вы создали изображение DDB, то пользуясь его идентификатором, нетрудно скопировать в него новый массив бит, соответствующий новому изображению. Дл...
4 2 Приложение BMPLOGO
4.2. Приложение BMPLOGOПриведем пример приложения BMPLOGO, которое демонстрирует работу с битовыми изображениями в формате DDB. Это приложение создает одно битовое изображение в памяти и рисует ег...
Рис 4 3 Приложение BMPLOGO
Рис 4.3. Приложение BMPLOGOЗаметим, что для рисования слова "Bitmap" мы не пользовались какими-либо особенностями шрифтов True Type. Эффект теней был получен при помощи двухкратного выво...
4 3 Битовые изображения в формате DIB
4.3. Битовые изображения в формате DIB Как мы уже говорили, битовые изображения DDB имеют один существенный недостаток - они "привязаны" к конкретному типу устройства вывода. В графическ...
Форматы файлов и структур данных
Форматы файлов и структур данныхЕсли рассматривать структуру bmp-файлов в общем, для нас интересны два формата. Первый формат используется в Windows версий 3.х, второй - в графической оболочке Pre...
Формат bmpфайлов Windows
Формат bmp-файлов WindowsФормат bmp-файлов для операционной системы Windows версий 3.0 и 3.1 представлен на Рисунок 4.4 (в более старых версиях bmp-файлы содержали битовые изображения в формате DD...
Рис 4 4 Формат bmpфайла для Windows версии 3 х
Рис 4.4. Формат bmp-файла для Windows версии 3.хФайл, содержащий битовое изображение, начинается со структуры BITMAPFILEHEADER. Эта структура описывает тип файла и его размер, а также смещение обл...
Таблица 3
Таблица 3ПолеОписаниеbfTypeТип файла. Поле содержит значение 0x4D42 (текстовая строка "BM"). Анализируя содержимое этого поля, приложение может идентифицировать файл как содержащий битов...
Таблица 4
Таблица 4ПолеОписаниеbiSizeРазмер структуры BITMAPINFOHEADER в байтах biWidthШирина битового изображения в пикселах biHeightВысота битового изображения в пикселах biPlanesКоличество плоскостей в б...


Содержание