Графический интерфейс windows gdi

Интерфейс Windows графических устройств (GDI)

Интерфейс графических устройств (GDI)

GDI (Graphics Device In­terface) — интерфейс графических устройств является подсистемой Windows, используемой программами для рисования на экране. GDI позволяет рисо­вать на экране, принтере, графопостроителе или на других устройствах отображения с помощью драйверов. Программный драйвер является существенным элементом видеосистемы, с помощью которого осуществляется связь программного обеспечения с аппаратурой видеоадаптера. Плохой драйвер может свести на нет все преимущества быстродействующего адаптера. Главное в работе GDI — сделать программы в меру независимыми от ре­альной аппаратуры.

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

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

Команды рисования, представленные простейшими рисующими програм­мами, такими как входящая в Windows программа Paintbrush, эти команды в основ­ном отражают функции GDI. Более сложные рисующие программы, например CorelDRAW, выпол­няют сложные операции типа закрашивания (заливки) фонтаном и рисования сложных кривых.

Наиболее общей операцией Windows является перемещение прямоугольников из одной области экрана в другую; эта операция называется пересылкой блока (строки) битов (Bit Block Transfer), или BitBLT (Название операции произносится как BitBlit или просто blit). Windows выполняет операцию blit во время процесса прокрутки в окне. При прокрутке в направлении конца файла изображение на экране движется вверх. Хорошо написанные программы перемещают ранее созданное изображение вверх, занося новый рисунок в отображаемый участок окна с помощью операции blit. Поскольку пе­ремещаемые прямоугольники обычно содержат много пикселей, происходит перемещение большого количества данных. Ускорение операции blit приводит к более быстрой прокрутке.

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

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

Аппаратное выполнение функций GDI

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

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

Читайте также:  Как наделить пользователя правами администратора windows

Программный интерфейс в GDI. Чтобы рисовать на экране, программы в среде Windows обращаются к GDI. Необходимые программам операции могут либо непосредственно вы­полняться аппаратными средствами, либо требуют дополнительных средств.

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

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

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

Метафайлы в Windows

Операции, поддерживаемые GDI, непосредственно отражены в формате метафайлов операционной системы Windows (Windows Metafile Format), который хранится в файлах с расширением WMF и в объектах типа “рисунок”(picture), находящихся в буфере обмена.

Метафайлы содержат последовательность команд для вывода изображения, а не само изображение и поэтому они значительно меньше изображений в пикселах по объему (примерно 1: 10). Метафайлы допускают увеличение или уменьшение масштаба изображения без потери четкости и качества, а растровое изображение нет.

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

GDI (Graphics Device Interface)

GDI (Graphics 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, что даёт программистам доступ к большему количеству аппаратных возможностей. [Источник 1]

Содержание

Поддерживаемые операции

GDI поддерживает следующие операции рисования:

  1. установку определенного цвета в конкретном пикселе;
  2. рисование линии с учетом характеристик толщины, шаблона, цвета и стиля кисти;
  3. рисование дуги;
  4. рисование эллипса (окружности);
  5. рисование прямоугольника, прямоугольника со скругленными углами или многоугольника;
  6. рисование замкнутых фигур, заполненных сплошным цветом или шаблоном;
  7. рисование текста с указанным шрифтом, цветом и размером;
  8. перемещение прямоугольника по экрану, возможно, с изменением размеров;
  9. ограничение операций рисования или операций перемещения в определенной области, чтобы не затрагивать изображение за пределами этой области. [Источник 2]
Читайте также:  Как посмотреть температуру процессора windows 10 через cmd

Контекст устройства

Контекст устройства (Device context) — это то место, куда рисуется графика, плюс средства рисования графики. Можно получить контекст устройства окна и после этого рисовать что-то в этом окне. Можно получить контекст устройства принтера и рисовать фигуры на печатаемой странице. Контекст устройства позволяет использовать кисти (brushes), перья (pens), картинки (bitmaps) для вывода графики.

Получение контекста устройства окна

Для получения контекста устройства окна используется описатель окна (HWND). Контекст устройства представлен в программе переменной типа HDC — переопределённый указатель на void. Для получения контекста устройства окна используется функция getDC:

После этого можно использовать переменную hDC для рисования в окне hWnd. После завершения рисования, нужно «отпустить» контекст устройства с помощью функции ReleaseDC .

Функция Rectangle принимает следующие аргументы: контекст устройства, координаты левого верхнего угла, координаты правого нижнего угла.

Функция TextOut принимает аргументы: контекст устройства, координаты левого верхнего угла текста, текстовая строка, количество символов в текстовой строке.

Функция Release принимает аргументы: окно, контекст устройства.

Вывод графики в нескольких окнах

Когда заполняется структура WNDCLASS, чтобы зарегистрировать класс окна программы в Windows, заполняется поле style:

Данное поле задаёт стиль класса окон. Значение CS_OWNDC говорит, что для каждого окна данного класса будет создан свой контекст устройства. [Источник 3]

Типы контекста устройства

В GDI существуют пять типов контекста устройства:

  • связанный с дисплеем (Display DC)
  • принтером (Printer DC)
  • контекст виртуального устройства в памяти (Memory DC)
  • контекст Metafile DC
  • специальный вид контекста — информационный (Information DC).

Первые четыре типа контекста устройства — display, printer, memory и metafile предоставляют унифицированный интерфейс для вывода графической информации на разнотипные устройства, освобождая приложение (и его разработчика) от необходимости заботится о том, куда именно производится вывод графики. Информационный контекст для вывода графики не используется, он служит исключительно для получения информации о параметрах и поддерживаемых режимах устройства, с которым связан.

В чем отличие первых четырех типов контекста? Это можно понять из их названий — Display DC служит для вывода на экран, Printer DC для печати на принтер или графопостроитель, Memory DC служит для создания растровых изображений в памяти с возможностью быстрого их копирования в другие типы контекстов (и обратно), Metafile DC нужен для вывода графики в метафайл. Метафайл — это хранилище последовательности команд GDI, каждая из которых описывает одну графическую функцию. В отличие от растровых файлов, хранящих графическую информацию непосредственно в виде массива пикселов, метафайл ее хранит в виде последовательности команд, которая создает результирующий рисунок. [Источник 4]

Регионы Windows

Для повышения эффективности работы Windows оперирует с несколькими типами регионов. Идея заключается в том, чтобы рисовать именно в той части окна, которая требует обновления, а не перерисовывать все окно. Также регионы позволяют отсекать вывод той части графической информации, которая не может быть отображена в данный момент. Вообще полное изучение всей иерархии регионов и их взаимодействия является непростой задачей, требующей пространного из ложения1. В то же время приведенное ниже упрощенное описание достаточно для понимания работы большинства функций Win32 GDI.

Обновляемый регион (update region), или, как его тоже иногда называют, недействительный регион (invalid region) — это часть окна, которая требует обновления после возникновения тех или иных событий.

Видимый регион (visible region) — та часть окна, которую в данный момент видит пользователь. Система изменяет видимый регион окна и в том случае, когда окно изменяет размеры, и в том случае, когда перемещение другого окна либо закрывает часть данного окна, либо открывает закрытую прежде часть.

Регион отсечения (clipping region) ограничивает область, внутри которой система разрешает отображение графической информации. Когда приложение получает контекст устройства при помощи функции BeginPaint, система устанавливает регион отсечения путем пересечения видимого региона и обновляемого региона. Приложение может ужесточить регион отсечения и ввести дополнительные ограничения при помощи вызова функции SetWindowRgn, SelectClipPath или SelectClipRgn.

Читайте также:  Risen terminating program now dump and log have been written windows 10 to

Если при создании окна функцией CreateWindow был использован стиль WS_CLIPCHILDREN или WS_CLIPSIBLINGS, то это вносит дополнительные правила в определение видимого региона, исключая из него любое дочернее или любые «сестринские» окна. Благодаря этому рисование не затрагивает отображаемые области таких окон.

GDI принтеры

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

Non-GDI принтеры требуют аппаратные средства, оборудование и память для рендеринга страницы; принтер GDI использует ЭВМ для этого, что делает его дешевле в производстве, чем подобные Non-GDI принтеры. Некоторые производители выпускают, по сути, один и тот же принтер в версиях, совместимых с языком управления принтера, такие как PCL или PostScript, и дешевле GDI-only версия.

Принтер с собственным языком управления может принимать входные данные от любого устройства с подходящим драйвер; для принтера GDI требуется ПК с операционной системой Windows. В общем принтеры GDI не совместимы с аппаратными принт-серверами, хотя некоторые серверы имеют встроенные возможности обработки, что делает их совместимыми с принтерами GDI. [Источник 5]

Интерфейс GDI+ — это модель рисования общего назначения для приложений .NET. В среде .NET интерфейс GDI+ используется в нескольких местах, в том числе при отправке документов на принтер, отображения графики в Windows-приложениях и визуализации графических элементов на веб-странице.

Применение кода GDI+ для прорисовки графики — это более медленный процесс, чем использование файла статического изображения. Однако этот метод обеспечивает значительно большую свободу и предоставляет несколько возможностей, которые были недоступны (или являлись недопустимо сложными) в предшествующих платформах разработки веб-приложений, таких как классическая ASP. Например, можно генерировать графические элементы, которые используют специфичную для пользователя информацию, и визуализировать диаграммы и графики в соответствии с записями базы данных. [Источник 6]

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, возможность работы изнутри с такими графическими форматами, как JPEG и PNG, куда лучшая реализация регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких, как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор обёрток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — то есть видеопроцессор трёхмерной графики для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года. [Источник 7]

Оцените статью