Общие сведения о контексте GDI
Аннотация: На лекции описываются типы контекста отображения, правила их использования и функции для работы с разными типами контекстов. Описывается, почему надо обязательно закрывать контекст после его использования в операциях ввода-вывода.
10.1. Определение контекста отображения и устройства
Интерфейс графических устройств операционной системы Microsoft Windows (в дальнейшем — просто GDI ) предназначено для взаимодействия приложений Windows с графическими устройствами ЭВМ. Использование такого «промежуточного уровня» между приложением Windows и устройством позволяет решить следующие проблемы:
- Средствами GDI можно вывести любой текст, изображение, форматирование на любое устройство ЭВМ, которое при подключении к операционной системе Windows имеет для неё собственный драйвер. Следовательно, единообразно можно вывести информацию на любое устройство: принтер, монитор, графопостроитель, в локальную или глобальную сеть, не занимаясь «прямым программированием устройств» (как это Вам пришлось осуществлять бы в MS-DOS);
- Средствами GDI осуществляется вывод не на физическое, а на «логическое» устройство. Это значит, что Вы, например, можете задать вывод картинки с 16 млн. цветов на монитор, поддерживающий только 256 цветов. Вывод изображения на «логический монитор» средствами GDI будет производиться единообразно, будут задействованы все 16 млн. цветов. Однако драйверы видеокарты и монитора учтут свои ограничения на имеющийся цветовой диапазон, и «автоматически» преобразуют картинку с 16 млн. цветами в картинку с 256 цветами. Драйвер принтера вообще преобразует эту картинку в двухцветное изображение, напечатав полутона в виде растра («мозаики»);
- Имея параметры физических устройств, подключённых ЭВМ, «ниже среднего уровня», Вы, тем не менее, можете создавать программы для любых «продвинутых устройств» ЭВМ, отсутствующих на Вашем компьютере. Более того, Вы можете осуществлять программирование устройств, ещё не созданных для данных ЭВМ — необходимо только, чтобы эти устройства были, во-первых, совместимые с ЭВМ на аппаратном уровне, а во-вторых, разработка их драйверов должна укладываться в стандарты, по которым создаются драйверы для указанного семейства устройств и стандартами Microsoft в написании драйверов к операционной системе Windows;
- Такая ситуация, когда приложение запрашивает у Windows одно, а получает другое, возникает не только при работе с цветом. Приложение может запросить для вывода шрифт, описав его характеристики, а GDI подберёт к выводу наиболее подходящий (с его точки зрения) шрифт, соответствующий описанию, и предоставит его приложению для вывода. Вначале такой подход обескураживает, но затем Вы начинаете понимать, что такой способ является единственным способом заставить работать программу Windows на любом оборудовании, любой аппаратной части. В самом деле, шрифтом, которым выводятся данные на экран, часто нельзя выводить данные на принтер — его может не быть в списке поддерживаемых шрифтов для данной модели принтера. И что же, из-за этого не выводить данные на принтер?…
Из чего состоит интерфейс GDI с точки зрения приложения?
Прежде всего, это контекст отображения и инструменты для рисования. Контекст является как бы листом бумаги, на котором приложения рисует графику и текст. Инструменты рисования — это перья, кисти (а также шрифты, курсоры, иконки, и даже целые графические изображения), с помощью которых создаётся изображение на устройстве.
01. Основы графики Windows. Изучаем GDI. Pen, Brush, Rectangle.
Messing with Windows GDI
Если же говорить более точно, то контекст — это структура данных, описывающая устройство отображения. В этой структуре хранятся различные характеристики устройства и набор инструментов рисования, выбранные по-умолчанию. Приложение может выбирать в контексте отображения различные инструменты.
Но собственно в функциях рисования изображений и вывода текста эти инструменты не указываются — они «наследуются» из контекста. Приложение сможет создать контекст отображения не только для экрана монитора или окна, но и для любого другого графического устройства вывода, например, принтера и графопостроителя . Можно создать контекст изображения для метафайла. Метафайл — это обычный файл или файл в памяти, в котором хранится последовательность команд интерфейса GDI . Приложение может осуществить вывод графической информации в метафайл, а затем вывести содержимое метафайла на любое устройство вывода.
Изучение GDI мы начнём с подробного описания контекста изображения и его атрибутов. Собственно схема взаимодействия контекста и драйверов устройства показана на рисунке 10.1.
Рис. 10.1. Ввод-вывод данных через контекст устройства
Также во вводной части необходимо отметить, что контекст — очень ресурсоёмкая структура данных, которая, к тому же, не освобождается при закрытии приложения, его вызвавшего. Поэтому, если создать множество контекстов, а затем не удалить (или не освободить) эти контексты, Ваша система как бы «ни с того ни с сего» станет работать нестабильно, и это может привести к краху операционной системы и её перезагрузке. Поэтому применяем следующие правила:
- Контекст открывается и освобождается в пределах описания реакции на одно системное сообщение. То есть оно должно вести себя так же, как и при работе с файлами;
- Контекст освобождается сразу же, как только отпала в нём надобность (после чтения и установки его параметров по-умолчанию, ввода-вывода графической информации и т.п.)
10.2. Правила работы с контекстом
10.2.1. Работа с контекстом отображения
Как правило, приложения выполняют свою работу по рисованию содержимого окна во время обработки сообщения Windows WM_PAINT , хотя часто требуется рисовать и во время обработки других сообщений. В любом случае приложению нужно придерживаться следующей последовательности действий:
- получение или создание контекста отображения;
- установка необходимых атрибутов в контексте отображения;
- выполнение операций рисования;
- освобождение либо удаление контекста отображения.
Последнее действие (освобождение либо удаление контекста отображения) должно быть обязательно выполнено. Самый простой способ полностью нарушить работоспособность Windows — забыть освободить полученный контекст отображения или забыть удалить созданный контекст отображения или устройства.
Так как контекст отображения — «самый критичный» ресурс Microsoft Windows, его необходимо освобождать сразу, как только в нём отпадает необходимость. Операционная система Microsoft Windows выполняет кэширование обычного контекста отображения, причём кэшируется только пять контекстов (информация для Microsoft Windows 3.11). Если операционная система не может удовлетворить запрос какого-либо приложения на выделение контекста отображения, вся операционная система окажется в критическом состоянии, из которого есть только один выход — перезагрузка Windows.
10.2.2. Типы контекстов отображения
Можно выделить следующие типы контекста отображения:
- общий контекст отображения (common display context);
- контекст отображения класса окна (class display context);
- личный контекст отображения (private display context);
- родительский контекст отображения (parent display context);
- контекст отображения для окна (window display context);
- контекст физического устройства ( device context );
- информационный контекст (information context);
- контекст для памяти (memory device context );
- контекст для метафайла ( metafile context);
Каждый из перечисленных выше контекстов имеет свои особенности и своё назначение.
10.2.3. Общий контекст отображения
Этот контекст используется чаще всего, поэтому для ускорения доступа к нему Windows использует кэширование. Для получения общего контекста отображения приложение должно вызвать функцию BeginPaint (при обработке сообщения WM_PAINT ) или GetDC (при обработке других сообщений). При этом перед регистрацией класса окна в структуре WNDCLASS не должны использоваться значения CS_OWNDC , CS_PARENTDC или CS_CLASSDC . Например:
wc.style = 0;
Листинг 10.1.
Функция BeginPaint возвращает контекст отображения для окна hwnd :
HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT FAR *lpps);
Листинг 10.2.
Перед этим функция подготавливает окно для рисования, заполняя структуру PAINTSTRUCT информацией, которую можно использовать в процессе рисования.
Назначение полей структуры PAINTSTRUCT смотри в приложении № I к данной лекции (п. 10.4).
Контекст отображения, полученный с помощью функции BeginPaint , необходимо освободить перед завершением обработки сообщения WM_PAINT , вызвав функцию EndPaint с теми же параметрами:
void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps);
Листинг 10.3.
Примечание: функции BeginPaint и EndPaint можно использовать только внутри обработчика сообщения WM_PAINT . Если приложению Microsoft Windows требуется рисовать при обработке других сообщений, оно должно получить контекст отображения с помощью функции GetDC и освободить функцией ReleaseDC ;
Функция GetDC возвращает контекст отображения для окна с идентификатором hwnd :
HDC WINAPI GetDC( HWND hwnd );
Листинг 10.4.
Функция ReleaseDC освобождает контекст изображения hdc , полученный для окна hwnd :
int WINAPI ReleaseDC( HWND hwnd, HDC hdc );
Листинг 10.5.
Каждый раз, когда приложение получает общий контекст отображения, его атрибуты получают значения по-умолчанию, перечисленные нами в следующей, справочной лекции.
Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции GDI , в следующий раз при получении значений эти атрибуты вновь примут значения по-умолчанию. Поэтому установка атрибутов должна выполняться каждый раз после получения общего контекста отображения. Это очень неудобно, не быстро, такая процедура отнимает дополнительное время. Но эта операция необходима при использовании контекста отображения этого типа. Если это Вас не устраивает, смотри ниже другие контексты отображения.
Источник: intuit.ru
Структура GDI
С точки зрения программиста GDI состоит из нескольких сотен функций и нескольких связанных с ними типов данных, макросов и структур. Но прежде, чем рассматривать некоторые из этих функций подробно, следует остановиться на общей структуре GDI .
Типы функций
В основном, функции GDI могут быть разбиты на несколько крупных групп. Это группы не имеют четких границ и частично перекрываются. Все они, тем не менее, перечислены ниже: • Функции, которые получают (или создают) и освобождают (или уничтожают) контекст устройства. Как уже указывалось в главе 3, вам для рисования необходим описатель контекста устройства.
Функции GetDC и ReleaseDC позволяют вам сделать это внутри обработчиков сообщений, отличных от WM_PAINT. Функции BeginPaint и EndPaint (хотя технически — это часть подсистемы USER в Windows) используются в теле обработчика сообщения WM_PAINT для рисования. Некоторые другие функции, относящиеся к работе с контекстом устройства, мы рассмотрим ниже.
71 • Функции, которые получают информацию о контексте устройства. Вспомним, в программе SYSMETS в главе 3 мы использовали функцию GetTextMetrics для получения информации о размерах выбранного в контексте устройства шрифта. Далее в этой главе мы рассмотрим программу DEVCAPS1, с помощью которой можно получить самую общую информацию о контексте устройства. • Функции рисования.
Очевидно, из всех предварительно рассмотренных функций — это одна из самых важных. В главе 3 мы использовали функцию TextOut для отображения текста в рабочей области окна. Как мы увидим далее, другие функции GDI позволяют рисовать линии, залитые области, растровые образы. • Функции, которые устанавливают и получают атрибуты контекста устройства.
Атрибут контекста устройства определяет различные особенности работы функции рисования. Например, вы используете функцию SetTextColor для задания любого текста, выводимого с использованием функции TextOut (или любой другой функции вывода текста).
В программах SYSMETS в главе 3 мы использовали функцию SetTextAlign для того, чтобы сообщить GDI, что начальное положение текстовой строки при вызове функции TextOut должно быть справа, по умолчанию — левое начальное положение. Все атрибуты контекста устройства имеют значение по умолчанию, которое устанавливается, при получении контекста устройства.
Для всех функций Set есть функции Get , позволяющие получить текущее значение атрибута контекста устройства. • Функции, которые работают с объектами GDI. Именно эти функции вносят в GDI некоторый беспорядок . Сначала пример: по умолчанию любые линии, которые вы рисуете, используя GDI, — сплошные и стандартной ширины.
Вы хотите изобразить линии более широкими или сделать их штрихпунктирными. Ширина линии и стиль линии не являются атрибутами контекста устройства. Это характеристики «логического карандаша».
Вы можете создать логический карандаш, указав данные характеристики в функциях CreatePen , CreatePenIndirect , ExtCreatePen . Эти функции возвращают описатель логического карандаша. (Хотя считается, что эти функции являются частью GDI, в отличие от большинства функций GDI они не требуют описателя контекста устройства.) Для использования логического карандаша вы «выбираете» описатель в контекст устройства. С этого момента все рисуемые линии будут отображаться с использованием этого карандаша. Затем вы отменяете выбор объекта «карандаш» и уничтожаете его. Кроме карандашей, вы также используете объекты GDI для создания кистей, которыми зарисовываются замкнутые области для создания шрифтов, растровых образов и других объектов GDI, о которых будет рассказано в этой главе.
Примитивы GDI
Типы графических объектов, выводимых на экран или принтер, которые могут быть разделены на несколько категорий, часто называют «примитивами». Это: • Прямые (отрезки) и кривые. Прямые — основа любой векторной графической системы. GDI поддерживает прямые линии, прямоугольники, эллипсы (включая окружности), дуги, являющиеся частью кривой эллипса, и сплайны Безье.
Все они будут рассмотрены в этой главе. Более сложные кривые могут быть изображены как ломаные линии, которые состоят из очень коротких прямых, определяющих кривые. Линии рисуются с использованием карандаша, выбранного в контексте устройства. • Закрашенные области.
Если набор прямых и кривых линий ограничивает со всех сторон некоторую область, то она может быть закрашена с использованием объекта GDI «кисть», выбранного в контексте устройства. Эта кисть может быть сплошной, штриховой (состоящей из горизонтальных, вертикальных или диагональных штрихов) или шаблонной, заполняющей область горизонтально и вертикально. • Битовые шаблоны (растровые шаблоны, растровые образы).
Битовые шаблоны — это двумерный массив битов, соответствующий пикселям устройства отображения. Это базовый инструмент в растровой графике. Битовые образы используются, в основном, для отображения сложных (часто из реального мира) изображений на дисплее или принтере.
Битовые образы также используются для отображения маленьких картинок, таких как значки, курсоры мыши, кнопки панели инструментов программ, которые нужно быстро нарисовать. GDI поддерживает два типа битовых образов или шаблонов — старые, но все еще используемые, аппаратно-зависимые, являющиеся объектами GDI, и новые (начиная с версии Windows 3.0) аппаратно-независимые (Device Independent Bitmap, DIB), которые могут быть сохранены в файлах на диске. • Текст.
Текст отличается от других математических объектов компьютерной графики. Типов текста бесконечно много. Это известно из многолетней истории типографского дела, которое многие считают искусством. Поэтому поддержка текста часто наиболее сложная часть в системах компьютерной графики, и, вместе с тем, наиболее важная.
Структуры данных, используемые для описания объектов GDI — шрифтов, а также для получения информации о них — самые большие среди других структур данных в Windows. Начиная с версии Windows 3.1, GDI поддерживает шрифты TrueType, основанные на закрашенных контурах, которыми могут манипулировать другие функции GDI. Windows 95 из
Источник: studfile.net
Введение
В настоящее время, обозреватель графических файлов является одной из тех программ, без которых обычный пользователь не представляет свой компьютер. Большинство людей хранит на своем компьютере фотографии, картинки и для их просмотра необходима такая программа.
Современные графические обозреватели поддерживают большое количество форматов, и имеют возможность редактирования графики, в нашем обозревателе эта функция отсутствует.
Теоретическая часть
Обозреватель графических файлов
Обозреватель графических файлов — компьютерная программа, предназначенная для просмотра графических файлов .В нашем случае поддерживает форматы: BMP, JPEG, JPG, TIFF, GIF, PNG.
Библиотека классов GDI+
GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных якомпонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.
GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.
GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.
Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких, как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.
Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.
С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++.
GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких, как Flash или SVG.
Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.
Источник: studbooks.net
Программа gdi windows что это
(15 января 2011)
Инструкция по установке GDI+
GDI+ — это технология 2D-графики от фирмы Microsoft, предоставляющая дополнительные графические возможности программам независимых разработчиков. Она входит в состав Windows XP, Vista и 7, а для более ранних операционных систем требуется установка дополнительного файла. Вы можете получить более подробную информацию о GDI+ на официальном сайте Microsoft.
GPSMapEdit использует GDI+ для работы с графическими файлами. Отсутствие GDI+ на Вашем компьютере приведет к тому, что не будут поддерживаться такие форматы, как PNG и TIFF, но все остальные функции будут доступны в полном объёме.
(a) Если Вы работаете в Windows XP, Windows Vista или Windows 7, то ничего дополнительно устанавливать не нужно: GDI+ в системе уже есть.
(b) Если Вы работаете в Windows 2000, то скачайте, распакуйте и скопируйте файл gdiplus.dll (908 КБ) в папку с mapedit.exe.
Этот сайт использует куки (cookies).
Продолжая использовать сайт, вы принимаете Политику конфиденциальности
и соглашаетесь на использование куки.
Источник: www.geopainting.com