Определение возможностей устройств ввода/вывода
В программном интерфейсе Windows имеется функция GetDeviceCaps, позволяющая по контексту определить возможности и параметры драйвера, обслуживающего устройство ввода/вывода.
Функция GetDeviceCaps имеет следующий прототип:
int WINAPI GetDeviceCaps(HDC hdc, int iCapability);
Первый параметр функции (hdc) задает контекст устройства, для которого необходимо получить информацию о его возможностях. Вы можете, например, указать значение, полученное от функции BeginPaint или GetDC.
Второй параметр (iCapability) определяет параметр устройства, значение которого необходимо получить.
Приведем список возможных значений для второго параметра функции GetDeviceCaps. Все эти значения определены как символьные константы в файле windows.h.
Имя константы | Описание |
ASPECTX | Относительная ширина отдельного пиксела, который используется при рисовании линий |
ASPECTXY | Относительная длина диагонали отдельного пиксела, который используется при рисовании линий |
ASPECTY | Относительная высота отдельного пиксела, который используется при рисовании линий |
BITSPIXEL | Количество бит, используемых для представления цвета в одном пикселе |
CLIPCAPS | Возможности устройства по ограничению области вывода: CP_NONE вывод не ограничивается; CP_RECTANGLE вывод ограничивается прямоугольной областью;CP_REGION вывод ограничивается произвольной областью |
COLORRES | Цветовое разрешение устройства в битах на пиксел. Это значение можно использовать только для устройств, использующих цветовые палитры, что можно определить при помощи константы RASTERCAPS. Данную константу можно использовать только для драйверов версии 3.0 и более поздних версий |
CURVECAPS | Способность устройства рисовать различные кривые линии и геометрические фигуры. Возвращаемое значение представляет собой набор битовых масок, установленных в 1, если устройство может само рисовать различные фигуры: CC_CIRCLES окружности; CC_CHORD сегмент эллипса; CC_ELLIPSES эллипсы; CC_INTERIORS устройство может закрашивать внутреннюю область геометрических фигур; CC_NONE устройство не может рисовать кривые линии и геометрические фигуры; CC_PIE секторы эллипса; CC_ROUNDRECT прямоугольники со скругленными углами; CC_STYLED устройство может рисовать рамки с использованием различных стилей (штриховые, пунктирные, штрих-пунктирные и т.д.); CC_WIDE широкие рамки; CC_WIDESTYLED устройство может рисовать широкие рамки с использованием различных стилей (штриховые, пунктирные, штрих-пунктирные и т. д.) |
DRIVERVERSION | Номер версии драйвера устройства. Значение 0x300 соответствует версии 3.0, значение 0x30a - версии 3.1 |
HORZRES | Ширина экрана в пикселах. Для принтеров - ширина рабочей области, в пределах которой может выполняться печать |
HORZSIZE | Стандартная для данного разрешения ширина дисплея в миллиметрах |
LINECAPS | Способности устройства рисовать линии. Возвращаемое значение представляет собой набор битовых масок, установленных в 1, если устройство может само рисовать линии различного типа: LC_INTERIORS устройство может закрашивать внутреннюю область; LC_MARKER маркеры; LC_NONE устройство не может рисовать линии; LC_POLYLINE ломаные линии; LC_POLYMARKER линии polymarker; LC_STYLED устройство может рисовать линии с использованием различных стилей (штриховые, пунктирные, штрих пунктирные и т.д.); LC_WIDE широкие линии; LC_WIDESTILED устройство может рисовать широкие линии с использованием различных стилей (штриховые, пунктирные, штрих-пунктирные и т. д.) |
LOGPIXELSX | Количество пикселов на один логический дюйм по горизонтали |
LOGPIXELSY | Количество пикселов на один логический дюйм по вертикали |
NUMBRUSHES | Количество кистей, поддерживаемых устройством |
NUMCOLORS | Количество цветов, зарезервированных Windows для использования в цветовых палитрах устройства, то есть количество чистых цветов, которые может использовать устройство. Для драйверов монохромных устройств возвращается значение 2. Для плоттеров это значение соответствует количеству цветных перьев |
NUMFONTS | Количество шрифтов, поддерживаемых устройством |
NUMMARKERS | Количество маркеров, поддерживаемых устройством |
NUMPENS | Количество перьев, поддерживаемых устройством |
NUMRESERVED | Количество зарезервированных элементов в системной палитре. Это значение определено только для устройств, использующих цветовые палитры, что можно выяснить при помощи константы RASTERCAPS. Данную константу можно использовать только для драйверов версии 3.0 и более поздних версий |
PDEVICESIZE | Размер внутренней структуры данных PDEVICE |
PLANES | Количество цветовых слоев |
POLYGONALCAPS | Способности устройства рисовать многоугольники. Возвращаемое значение представляет собой набор битовых масок, установленных в 1, если устройство может само рисовать многоугольники различного типа: PC_INTERIORS устройство может закрашивать внутреннюю область; PC_NONE устройство не может рисовать многоугольники; PC_RECTANGLE прямоугольники; PC_SCANLINES устройство может выполнять сканирование линий растра; PC_STYLED устройство может рисовать рамки с использованием различных стилей (штриховые, пунктирные, штрих-пунктирные и т. д.); PC_WIDE широкие рамки; PC_WIDESTILED устройство может рисовать широкие рамки с использованием различных стилей (штриховые, пунктирные, штрих-пунктирные и т. д.) PC_WINDPOLYGON многоугольники с заполнением в режиме WINDING |
RASTERCAPS | Набор битовых масок, определяющих способность устройства выполнять растровые операции: RC_BANDING для устройства требуется поддержка операции banding - функции GDI должны выводить данные небольшими сегментами, формирующими изображение (используется устройствами печати); RC_BIGFONT устройство поддерживает шрифты, размером большем чем 64 Кбайт; RC_BITBLT устройство может выполнять перемещение участков изображения в виде битовых образов (bitmap); RC_BITMAP64 устройство может работать с битовыми образами большого размера (больше 64 Кбайт); RC_DEVBITS есть поддержка битовых образов со стороны устройства; RC_DI_BITMAP устройство поддерживает выполнение функций SetDIBits и GetDIBits; RC_DIBTODEV устройство поддерживает выполнение функции SetDIBitsToDevice; RC_FLOODFILL устройство может выполнять заливку фигур; RC_GDI20_OUTPUT драйвер устройства поддерживает особенности Windows версии 2.0; RC_GDI20_STATE контекст устройства содержит блок состояния устройства; RC_NONE устройство не выполняет растровых операций; RC_OP_DX_OUTPUT устройство поддерживает режим непрозрачности и массив DX; RC_PALETTE устройство использует палитры цветов; RC_SAVEBITMAP устройство может локально сохранять битовые образы (bitmap); RC_SCALING поддерживается операция масштабирования; RC_STRETCHBLT устройство поддерживает функцию StretchBlt; RC_STRETCHDIB устройство поддерживает функцию StretchDIBits |
SIZEPALETTE | Размер таблицы палитры. Это значение можно использовать только для устройств, использующих цветовые палитры, что можно определить при помощи константы RASTERCAPS |
TECHNOLOGY | Тип устройства или технология, с использованием которой сделано устройство: DT_CHARSTREAM устройство работает с потоком символов; DT_DISPFILE файл отображения; DT_METAFILE метафайл; DT_PLOTTER векторный плоттер; DT_RASDISPLAY растровый дисплей; DT_RASPRINTER растровый принтер; DT_RASCAMERA растровая камера |
TEXTCAPS | Набор битовых масок, определяющих способность устройства выполнять операции с текстом: TC_OP_CHARACTER точность соответствия запрашиваемого и предоставленного шрифта. Если установлен этот бит, устройство может обеспечить запрошенные атрибуты символов;TC_OP_STROKE устройство может обеспечить необходимую высоту, ширину, ориентацию и атрибуты текста; TC_CP_STROKE точность вывода допускает обрезание символов шрифта для того, чтобы текст появился только внутри заданной области ограничения; TC_CR_90 устройство может поворачивать символы только на угол, кратный 90 градусам; TC_CR_ANY устройство может поворачивать символы на любой угол; TC_SF_X_YINDEP устройство может масштабировать свой шрифт по вертикальной и горизонтальной оси; TC_SA_DOUBLE устройство может удваивать размер своего шрифта; TC_SA_INTEGER устройство может увеличивать размер своего шрифта в любое целое количество раз; TC_SA_CONTIN устройство может выполнять произвольное масштабирование своего шрифта, сохраняя отношение между вертикальным и горизонтальным размером шрифта; TC_EA_DOUBLE устройство может увеличивать жирность своего шрифта в два раза; TC_IA_ABLE устройство может делать свой шрифт наклонным (italic); TC_UA_ABLE устройство может делать свой шрифт подчеркнутым; TC_SO_ABLE устройство может делать свой шрифт перечеркнутым; TC_RA_ABLE устройство способно перечислять растровые шрифты или шрифты TrueType при вызове функций EnumFonts или EnumFontFamilies; TC_VA_ABLE устройство способно перечислять векторные шрифтов при вызове функций EnumFonts или EnumFontFamilies; TC_RESERVED не используется |
VERTRES | Высота дисплея в пикселах. Для принтеров - высота рабочей области, в которой принтер способен выполнять печать |
VERTSIZE | Стандартная высота дисплея в миллиметрах |
Не все перечисленные выше значения будут сразу вам нужны, поэтому мы остановимся только на некоторых из них.
Значения ASPECTX, ASPECTY, ASPECTXY определяют размеры пиксела. Зачем вам могут понадобиться размеры пиксела? Дело в том, что пикселы не всегда квадратные (или круглые). Поэтому в некоторых режимах работы видеоадаптера масштаб изображения по оси x может отличаться от масштаба по оси y. Размеры пиксела позволят вам вычислить отношение сторон пиксела и выполнить правильное масштабирование. В этом случае отображаемые вами окружности будут круглыми, а квадраты - квадратными.
Иногда бывает важно знать цветовое разрешение устройства вывода. Для этого можно использовать значение BITSPIXEL, которое соответствует количеству бит, используемых для представления цвета. Если возвести число 2 в степень значения BITSPIXEL, получится количество цветов, которое может быть представлено одним пикселом.
Некоторые устройства работают с цветовыми плоскостями. Количество этих плоскостей можно определить, пользуясь значением PLANES. Об использовании цветовых плоскостей можно прочитать в третьем томе "Библиотеки системного программиста", который называется "Программирование видеоадаптеров CGA, EGA и VGA". Отметим, что количество цветов, которые могут быть представлены устройством с цветовыми плоскостями, равно 2n, где n - количество цветовых плоскостей.
Если устройство работает с цветовыми плоскостями и использует несколько бит для представления цвета одного пиксела, количество одновременно отображаемых цветов можно определить по формуле:
nColors = 2(nPixel * nPlanes),
где nPixel - количество битов, используемых для представления цвета пиксела (значение BITSPIXEL); nPlanes - количество цветовых плоскостей (значение PLANES).
Значение NUMCOLORS равно количеству цветов при использовании одной палитры. Так как палитра может быть перегружена, фактически вы можете использовать больше цветов, чем указано в NUMCOLORS. Но в этом случае вы должны сами перезагружать палитру.Для устройств, работающих с палитрами, правильное количество используемых цветов возвращается при использовании значения COLORRES.