Операционная система Microsoft Windows 3.1 для программиста -том 1

         

Приложение DCAPS


Для проведения экспериментов и демонстрации возможностей функции GetDeviceCaps мы подготовили приложение DCAPS (листинг 4.4).

Листинг 4.4. Файл dcaps\dcaps.cpp

// ---------------------------------------- // Определение возможностей устройств // ----------------------------------------

#define STRICT #include <windows.h> #include <stdio.h> #include <string.h>

// Прототипы функций void PrintD(int, char *); void PrintH(int, char *); void PrintFlag(int, int, char *);

FILE *out; // файл для вывода HDC hdc; // идентификатор контекста char buf[80]; // рабочий буфер int i; // рабочая переменная

// =========================================== // Функция WinMain // ===========================================

#pragma argsused

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {

// Открываем выходной файл для вывода // текста потоком // Если открыть файл не удалось, выводим // сообщение об ошибке if ((out = fopen("devcap.txt", "wt")) == NULL) { MessageBox(NULL, "Не могу открыть файл sysmet.txt", "Ошибка", MB_OK | MB_ICONSTOP); return 1; }

// Выводим заголовок файла fputs("* ============================ *\n", out); fputs("* DCAPS, (C) Frolov A.V., 1994 *\n", out); fputs("* ============================ *\n\n", out);

// Создаем контекст устройства для дисплея hdc = CreateDC("DISPLAY", NULL, NULL, NULL);

// Выводим основные характеристики устройства

PrintH(DRIVERVERSION, "DRIVERVERSION"); PrintD(ASPECTX, "ASPECTX "); PrintD(ASPECTXY, "ASPECTXY "); PrintD(ASPECTY, "ASPECTY "); PrintD(BITSPIXEL, "BITSPIXEL "); PrintD(COLORRES, "COLORRES "); PrintD(HORZRES, "HORZRES "); PrintD(HORZSIZE, "HORZSIZE "); PrintD(LOGPIXELSX, "LOGPIXELSX "); PrintD(LOGPIXELSY, "LOGPIXELSY "); PrintD(NUMBRUSHES, "NUMBRUSHES "); PrintD(NUMCOLORS, "NUMCOLORS "); PrintD(NUMFONTS, "NUMFONTS "); PrintD(NUMMARKERS, "NUMMARKERS "); PrintD(NUMPENS, "NUMPENS "); PrintD(NUMRESERVED, "NUMRESERVED "); PrintD(PDEVICESIZE, "PDEVICESIZE "); PrintD(PLANES, "PLANES "); PrintD(SIZEPALETTE, "SIZEPALETTE "); PrintD(VERTRES, "VERTRES "); PrintD(VERTSIZE, "VERTSIZE ");


fputs("-------------------------------\n", out); PrintH(CLIPCAPS, "CLIPCAPS "); fputs("-------------------------------\n", out); PrintFlag(CLIPCAPS, CP_NONE, "CP_NONE "); PrintFlag(CLIPCAPS, CP_RECTANGLE, "CP_RECTANGLE "); PrintFlag(CLIPCAPS, CP_REGION, "CP_REGION ");

fputs("-------------------------------\n", out); PrintH(CURVECAPS, "CURVECAPS "); fputs("-------------------------------\n", out); PrintFlag(CURVECAPS, CC_CIRCLES, "CC_CIRCLES "); PrintFlag(CURVECAPS, CC_CHORD, "CC_CHORD "); PrintFlag(CURVECAPS, CC_ELLIPSES, "CC_ELLIPSES "); PrintFlag(CURVECAPS, CC_INTERIORS, "CC_INTERIORS "); PrintFlag(CURVECAPS, CC_NONE, "CC_NONE "); PrintFlag(CURVECAPS, CC_PIE, "CC_PIE "); PrintFlag(CURVECAPS, CC_ROUNDRECT, "CC_ROUNDRECT "); PrintFlag(CURVECAPS, CC_STYLED, "CC_STYLED "); PrintFlag(CURVECAPS, CC_WIDE, "CC_WIDE "); PrintFlag(CURVECAPS, CC_WIDESTYLED,"CC_WIDESTYLED ");

fputs("-------------------------------\n", out); PrintH(LINECAPS, "LINECAPS "); fputs("-------------------------------\n", out); PrintFlag(LINECAPS, LC_INTERIORS, "LC_INTERIORS "); PrintFlag(LINECAPS, LC_MARKER, "LC_MARKER "); PrintFlag(LINECAPS, LC_NONE, "LC_NONE "); PrintFlag(LINECAPS, LC_POLYLINE, "LC_POLYLINE "); PrintFlag(LINECAPS, LC_POLYMARKER,"LC_POLYMARKER "); PrintFlag(LINECAPS, LC_STYLED, "LC_STYLED "); PrintFlag(LINECAPS, LC_WIDE, "LC_WIDE "); PrintFlag(LINECAPS, LC_WIDESTYLED,"LC_WIDESTYLED ");

fputs("-------------------------------\n", out); PrintH(POLYGONALCAPS,"POLYGONALCAPS "); fputs("-------------------------------\n", out); PrintFlag(POLYGONALCAPS, PC_INTERIORS,"PC_INTERIORS "); PrintFlag(POLYGONALCAPS, PC_NONE, "PC_NONE "); PrintFlag(POLYGONALCAPS, PC_POLYGON, "PC_POLYGON "); PrintFlag(POLYGONALCAPS, PC_RECTANGLE,"PC_RECTANGLE "); PrintFlag(POLYGONALCAPS, PC_SCANLINE, "PC_SCANLINE "); PrintFlag(POLYGONALCAPS, PC_STYLED, "PC_STYLED "); PrintFlag(POLYGONALCAPS, PC_WIDE, "PC_WIDE "); PrintFlag(POLYGONALCAPS,PC_WIDESTYLED,"PC_WIDESTYLED ");



fputs("-------------------------------\n", out); PrintH(RASTERCAPS,"RASTERCAPS "); fputs("-------------------------------\n", out); PrintFlag(RASTERCAPS, RC_BANDING, "RC_BANDING "); PrintFlag(RASTERCAPS, RC_BIGFONT, "RC_BIGFONT "); PrintFlag(RASTERCAPS, RC_BITBLT, "RC_BITBLT "); PrintFlag(RASTERCAPS, RC_BITMAP64, "RC_BITMAP64 "); PrintFlag(RASTERCAPS, RC_DEVBITS, "RC_DEVBITS "); PrintFlag(RASTERCAPS, RC_DI_BITMAP, "RC_DI_BITMAP "); PrintFlag(RASTERCAPS, RC_DIBTODEV, "RC_DIBTODEV "); PrintFlag(RASTERCAPS, RC_FLOODFILL, "RC_FLOODFILL "); PrintFlag(RASTERCAPS, RC_GDI20_OUTPUT,"RC_GDI20_OUTPUT "); PrintFlag(RASTERCAPS, RC_GDI20_STATE, "RC_GDI20_STATE "); PrintFlag(RASTERCAPS, RC_NONE, "RC_NONE "); PrintFlag(RASTERCAPS, RC_OP_DX_OUTPUT,"RC_PO_DX_OUTPUT "); PrintFlag(RASTERCAPS, RC_PALETTE, "RC_PALETTE "); PrintFlag(RASTERCAPS, RC_SAVEBITMAP, "RC_SAVEBITMAP "); PrintFlag(RASTERCAPS, RC_SCALING, "RC_SCALING "); PrintFlag(RASTERCAPS, RC_STRETCHBLT, "RC_STRETCHBLT "); PrintFlag(RASTERCAPS, RC_STRETCHDIB, "RC_STRETCHDIB ");

fputs("-------------------------------\n", out); PrintH(TECHNOLOGY,"TECHNOLOGY"); fputs("-------------------------------\n", out);

strcpy(buf, "Технология: ");

i = GetDeviceCaps(hdc, TECHNOLOGY); switch (i) { case DT_CHARSTREAM: strcat(buf, "DT_CHARSTREAM"); break; case DT_DISPFILE: strcat(buf, "DT_DISPFILE"); break; case DT_METAFILE: strcat(buf, "DT_METAFILE"); break; case DT_PLOTTER: strcat(buf, "DT_PLOTTER"); break; case DT_RASDISPLAY: strcat(buf, "DT_RASDISPLAY"); break; case DT_RASPRINTER: strcat(buf, "DT_RASPRINTER"); break; case DT_RASCAMERA: strcat(buf, "DT_RASCAMERA"); break; default: strcat(buf, "Неизвестная технология"); break; } strcat(buf, "\n"); fputs(buf, out);



fputs("-------------------------------\n", out); PrintH(TEXTCAPS,"TEXTCAPS "); fputs("-------------------------------\n", out); PrintFlag(TEXTCAPS, TC_OP_CHARACTER, "TC_OP_CHARACTER "); PrintFlag(TEXTCAPS, TC_OP_STROKE, "TC_OP_STROKE "); PrintFlag(TEXTCAPS, TC_CP_STROKE, "TC_CP_STROKE "); PrintFlag(TEXTCAPS, TC_CR_90, "TC_CR_90 "); PrintFlag(TEXTCAPS, TC_CR_ANY, "TC_CR_ANY "); PrintFlag(TEXTCAPS, TC_SF_X_YINDEP, "TC_SF_X_YINDEP "); PrintFlag(TEXTCAPS, TC_SA_DOUBLE, "TC_SA_DOUBLE "); PrintFlag(TEXTCAPS, TC_SA_INTEGER, "TC_SA_INTEGER "); PrintFlag(TEXTCAPS, TC_SA_CONTIN, "TC_SA_CONTIN "); PrintFlag(TEXTCAPS, TC_EA_DOUBLE, "TC_EA_DOUBLE "); PrintFlag(TEXTCAPS, TC_IA_ABLE, "TC_IA_ABLE "); PrintFlag(TEXTCAPS, TC_UA_ABLE, "TC_UA_ABLE "); PrintFlag(TEXTCAPS, TC_SO_ABLE, "TC_SO_ABLE "); PrintFlag(TEXTCAPS, TC_RA_ABLE, "TC_RA_ABLE "); PrintFlag(TEXTCAPS, TC_VA_ABLE, "TC_VA_ABLE "); PrintFlag(TEXTCAPS, TC_RESERVED, "TC_RESREVED ");

// Стираем созданный контекст устройства DeleteDC(hdc);

// Закрываем файл fclose(out);

MessageBox(NULL, "Сведения о возможностях устройства записаны " "в файл devcap.txt", "DCAPS", MB_OK | MB_ICONINFORMATION);

return 0; }

// ------------------------------------------ // Функция для вывода параметра с использованием // десятичной системы счисления // ------------------------------------------ void PrintD(int nIndex, char *str) { sprintf(buf, "%s\t%d\n", str, GetDeviceCaps(hdc, nIndex)); fputs(buf, out); return; }

// ------------------------------------------ // Функция для вывода параметра с использованием // шестнадцатеричной системы счисления // ------------------------------------------ void PrintH(int nIndex, char *str) { sprintf(buf, "%s\t0x%x\n", str, GetDeviceCaps(hdc, nIndex)); fputs(buf, out); return; }



// ------------------------------------------ // Функция для вывода значения отдельных // битов параметра // ------------------------------------------ void PrintFlag(int nIndex, int nFlag, char *str) { if((GetDeviceCaps(hdc, nIndex) & nFlag) == 0) sprintf(buf, "\t%s\t-\n", str); else sprintf(buf, "\t%s\t+\n", str);

fputs(buf, out); return; }

Это приложение интересно тем, что оно получает контекст устройства (видеоадаптера) новым для вас способом - при помощи функции CreateDC:

hdc = CreateDC("DISPLAY", NULL, NULL, NULL);

Контекст, полученный этим способом, может быть использован для рисования на всей поверхности экрана видеомонитора, а не только в окне приложения. В качестве первого параметра функции CreateDC указывается имя драйвера устройства. Драйвер видеоадаптера имеет имя DISPLAY.

Перед завершением работы приложения мы уничтожаем созданный нами контекст:

DeleteDC (hdc);

Для вывода числовых характеристик драйвера устройства в шестнадцатеричном формате используется функция PrintH, для вывода в десятичном формате - функция PrintD. Обе эти функции формируют и выводят в заранее открытый текстовый файл строку, содержащую имя параметра и значение, полученное от функции GetDeviceCaps.

Для отображения параметров, представленных набором флагов, используется функция PrintFlag. Функция записывает в файл имя флага и его состояние. Если флаг сброшен (значение равно 0), он помечается знаком "-", в противном случае - знаком "+".

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

Файл определения модуля для приложения DCAPS представлен в листинге 4.5.

Листинг 4.5. Файл dcaps\dcaps.def

; ============================= ; Файл определения модуля ; ============================= NAME DCAPS DESCRIPTION 'Приложение DCAPS, (C) 1994, Frolov A.V.' EXETYPE windows STUB 'winstub.exe' STACKSIZE 5120 HEAPSIZE 1024 CODE preload moveable discardable DATA preload moveable multiple



В листинге 4. 6 приведен результат работы программы при использовании стандартного драйвера видеоконтроллера VGA, поставляющегося вместе с Windows версии 3.1.

Листинг 4.6. Образец файла devcap.txt для драйвера VGA, разрешение 640x480, 16 цветов

* ============================ * * DCAPS, (C) Frolov A.V., 1994 * * ============================ * DRIVERVERSION 0x30a ASPECTX 36 ASPECTXY 51 ASPECTY 36 BITSPIXEL 1 COLORRES 0 HORZRES 640 HORZSIZE 208 LOGPIXELSX 96 LOGPIXELSY 96 NUMBRUSHES -1 NUMCOLORS 16 NUMFONTS 0 NUMMARKERS 0 NUMPENS 80 NUMRESERVED 0 PDEVICESIZE 35 PLANES 4 SIZEPALETTE 0 VERTRES 480 VERTSIZE 156 ------------------------------- CLIPCAPS 0x1 ------------------------------- CP_NONE - CP_RECTANGLE + CP_REGION - ------------------------------- CURVECAPS 0x0 ------------------------------- CC_CIRCLES - CC_CHORD - CC_ELLIPSES - CC_INTERIORS - CC_NONE - CC_PIE - CC_ROUNDRECT - CC_STYLED - CC_WIDE - CC_WIDESTYLED - ------------------------------- LINECAPS 0x22 ------------------------------- LC_INTERIORS - LC_MARKER - LC_NONE - LC_POLYLINE + LC_POLYMARKER - LC_STYLED + LC_WIDE - LC_WIDESTYLED - ------------------------------- POLYGONALCAPS 0x8 ------------------------------- PC_INTERIORS - PC_NONE - PC_POLYGON - PC_RECTANGLE - PC_SCANLINE + PC_STYLED - PC_WIDE - PC_WIDESTYLED - ------------------------------- RASTERCAPS 0x46d9 ------------------------------- RC_BANDING - RC_BIGFONT + RC_BITBLT + RC_BITMAP64 + RC_DEVBITS - RC_DI_BITMAP + RC_DIBTODEV + RC_FLOODFILL - RC_GDI20_OUTPUT + RC_GDI20_STATE - RC_NONE - RC_PO_DX_OUTPUT + RC_PALETTE - RC_SAVEBITMAP + RC_SCALING - RC_STRETCHBLT - RC_STRETCHDIB - ------------------------------- TECHNOLOGY 0x1 ------------------------------- Технология: DT_RASDISPLAY ------------------------------- TEXTCAPS 0x2204 ------------------------------- TC_OP_CHARACTER - TC_OP_STROKE - TC_CP_STROKE + TC_CR_90 - TC_CR_ANY - TC_SF_X_YINDEP - TC_SA_DOUBLE - TC_SA_INTEGER - TC_SA_CONTIN - TC_EA_DOUBLE + TC_IA_ABLE - TC_UA_ABLE - TC_SO_ABLE - TC_RA_ABLE + TC_VA_ABLE - TC_RESREVED -



В поле DRIVERVERSION стоит значение 30a, что соответствует версии драйвера 3.1.

Для вывода используется квадратный пиксел с размерами (36, 36), так что никаких мер для обеспечения равного масштаба по осям x и y принимать не надо.

Стандартный драйвер обеспечивает вывод 16 цветов. Из приведенного выше листинга видно, что для представления цвета пиксела используется один бит (значение BITSPIXEL равно 1). Количество цветовых плоскостей (значение PLANES) равно 4, следовательно, количество возможных цветов будет равно 24, или 16.

Значение бита RC_PALETTE значения RASTERCAPS равно нулю, следовательно, драйвер не использует палитры. Поэтому значение COLORRES (цветовое разрешение в битах на пиксел) равно нулю. Значение SIZEPALETTE также равно 0.

Количество возможных цветов, определяемых при помощи NUMCOLORS, равно 16. Это значение согласуется с полученным при помощи BITSPIXEL и PLANES.

Для сравнения приведем возможности драйверов контроллера Cirrus Logic в режимах с использованием 65536 цветов и 16,7 млн. цветов (точное значение - 224 цветов). Результаты работы нашего приложения для этих драйверов приведены соответственно в листинге 4.7 и 4.8.

Листинг 4.7. Образец файла devcap.txt для драйвера Cirrus Logic, разрешение 640x480, 65536 цветов

* ============================ * * DCAPS, (C) Frolov A.V., 1994 * * ============================ * DRIVERVERSION 0x30a ASPECTX 36 ASPECTXY 51 ASPECTY 36 BITSPIXEL 16 COLORRES 0 HORZRES 640 HORZSIZE 208 LOGPIXELSX 96 LOGPIXELSY 96 NUMBRUSHES -1 NUMCOLORS 4096 NUMFONTS 0 NUMMARKERS 0 NUMPENS 100 NUMRESERVED 0 PDEVICESIZE 32 PLANES 1 SIZEPALETTE 0 VERTRES 480 VERTSIZE 152 ------------------------------- CLIPCAPS 0x1 ------------------------------- CP_NONE - CP_RECTANGLE + CP_REGION - ------------------------------- CURVECAPS 0x0 ------------------------------- CC_CIRCLES - CC_CHORD - CC_ELLIPSES - CC_INTERIORS - CC_NONE - CC_PIE - CC_ROUNDRECT - CC_STYLED - CC_WIDE - CC_WIDESTYLED - ------------------------------- LINECAPS 0x22 ------------------------------- LC_INTERIORS - LC_MARKER - LC_NONE - LC_POLYLINE + LC_POLYMARKER - LC_STYLED + LC_WIDE - LC_WIDESTYLED - ------------------------------- POLYGONALCAPS 0x8 ------------------------------- PC_INTERIORS - PC_NONE - PC_POLYGON - PC_RECTANGLE - PC_SCANLINE + PC_STYLED - PC_WIDE - PC_WIDESTYLED - ------------------------------- RASTERCAPS 0x2d9 ------------------------------- RC_BANDING - RC_BIGFONT - RC_BITBLT + RC_BITMAP64 + RC_DEVBITS - RC_DI_BITMAP + RC_DIBTODEV + RC_FLOODFILL - RC_GDI20_OUTPUT + RC_GDI20_STATE - RC_NONE - RC_PO_DX_OUTPUT - RC_PALETTE - RC_SAVEBITMAP + RC_SCALING - RC_STRETCHBLT - RC_STRETCHDIB - ------------------------------- TECHNOLOGY 0x1 ------------------------------- Технология: DT_RASDISPLAY ------------------------------- TEXTCAPS 0x2004 ------------------------------- TC_OP_CHARACTER - TC_OP_STROKE - TC_CP_STROKE + TC_CR_90 - TC_CR_ANY - TC_SF_X_YINDEP - TC_SA_DOUBLE - TC_SA_INTEGER - TC_SA_CONTIN - TC_EA_DOUBLE - TC_IA_ABLE - TC_UA_ABLE - TC_SO_ABLE - TC_RA_ABLE + TC_VA_ABLE - TC_RESREVED -



Из листинга 4. 7 видно, что драйвер использует для представления цвета пиксела 16 бит (значение BITSPIXEL). Количество цветовых слоев равно 1 (значение PLANES), поэтому общее количество доступных цветов равно 65536.

Тем не менее значение NUMCOLORS равно 4096, что не соответствует цветовым возможностям данного драйвера. Здесь нет ошибки, дело в том, что, как мы уже говорили, значение NUMCOLORS соответствует количеству цветов в одной палитре, но не количеству доступных цветов.

Обратим теперь внимание на результаты тестирования драйвера, работающего в режиме TrueColor с использованием 16,7 млн. цветов (листинг 4.8).

Листинг 4.8. Образец файла devcap.txt для драйвера Cirrus Logic, разрешение 640x480, 16,7 млн. цветов

* ============================ * * DCAPS, (C) Frolov A.V., 1994 * * ============================ * DRIVERVERSION 0x300 ASPECTX 36 ASPECTXY 51 ASPECTY 36 BITSPIXEL 24 COLORRES 0 HORZRES 640 HORZSIZE 208 LOGPIXELSX 96 LOGPIXELSY 96 NUMBRUSHES -1 NUMCOLORS 4096 NUMFONTS 0 NUMMARKERS 0 NUMPENS 100 NUMRESERVED 0 PDEVICESIZE 32 PLANES 1 SIZEPALETTE 0 VERTRES 480 VERTSIZE 152 ------------------------------- CLIPCAPS 0x1 ------------------------------- CP_NONE - CP_RECTANGLE + CP_REGION - ------------------------------- CURVECAPS 0x0 ------------------------------- CC_CIRCLES - CC_CHORD - CC_ELLIPSES - CC_INTERIORS - CC_NONE - CC_PIE - CC_ROUNDRECT - CC_STYLED - CC_WIDE - CC_WIDESTYLED - ------------------------------- LINECAPS 0x22 ------------------------------- LC_INTERIORS - LC_MARKER - LC_NONE - LC_POLYLINE + LC_POLYMARKER - LC_STYLED + LC_WIDE - LC_WIDESTYLED - ------------------------------- POLYGONALCAPS 0x8 ------------------------------- PC_INTERIORS - PC_NONE - PC_POLYGON - PC_RECTANGLE - PC_SCANLINE + PC_STYLED - PC_WIDE - PC_WIDESTYLED - ------------------------------- RASTERCAPS 0x2d9 ------------------------------- RC_BANDING - RC_BIGFONT - RC_BITBLT + RC_BITMAP64 + RC_DEVBITS - RC_DI_BITMAP + RC_DIBTODEV + RC_FLOODFILL - RC_GDI20_OUTPUT + RC_GDI20_STATE - RC_NONE - RC_PO_DX_OUTPUT - RC_PALETTE - RC_SAVEBITMAP + RC_SCALING - RC_STRETCHBLT - RC_STRETCHDIB - ------------------------------- TECHNOLOGY 0x1 ------------------------------- Технология: DT_RASDISPLAY ------------------------------- TEXTCAPS 0x2004 ------------------------------- TC_OP_CHARACTER - TC_OP_STROKE - TC_CP_STROKE + TC_CR_90 - TC_CR_ANY - TC_SF_X_YINDEP - TC_SA_DOUBLE - TC_SA_INTEGER - TC_SA_CONTIN - TC_EA_DOUBLE - TC_IA_ABLE - TC_UA_ABLE - TC_SO_ABLE - TC_RA_ABLE + TC_VA_ABLE - TC_RESREVED -



Для этого режима цвет одного пиксела определяется 24 битами (значение BITSPIXEL) при использовании одной цветовой плоскости (значение PLANES). Поэтому общее количество доступных цветов равно 224, или, примерно 16,7 млн.

Значение NUMCOLORS по-прежнему равно 4096.

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

Параметр функции GetDeviceCaps CGA EGA VGA SVGA 800x 600 8514/A SVGA 1024 x 768
HORZRES 640 640 640 800 1024 1024
VERTRES 200 350 480 600 760 768
HORZSIZE 240 240 208 208 280 208
VERTSIZE 180 175 156 152 210 152
ASPECTX 5 38 36 36 10 36
ASPECTY 12 48 36 36 14 36
ASPECTXY 13 61 51 51 14 51
LOGPIXELSX 96 96 96 96 120 96
LOGPIXELSY 48 72 96 96 120 96
Размеры экрана в миллиметрах (HORZSIZE и VERTSIZE) относятся скорее к стандартному типу видеомонитора, чем к конкретному типу видеомонитора, подключенного к вашему компьютеру. В любом из перечисленных выше режимов вы можете использовать как 14-дюймовые, так и 17- или даже 20-дюймовые видеомониторы. В любом случае функция GetDeviceCaps будет возвращать значения размеров экрана, приведенные в таблице.

Из таблицы также видно, что для наиболее часто встречающихся типов видеоадаптеров (VGA, SVGA 800 x 600, SVGA 1024 x 768) используются квадратные пикселы с размером (36,36). В то же время видеоадаптеры CGA, EGA и 8514/A используют пикселы в форме прямоугольника.

Некоторые программы (например, Microsoft Word for Windows) способны рисовать дюймовые или миллиметровые линейки, которые можно использовать для измерения размеров объектов в естественных для человека единицах измерения (но не в пикселах). Значения LOGPIXELSX и LOGPIXELSY определяют количество пикселов в так называемом логическом дюйме. Логический дюйм не является "настоящим" дюймом, имеющим длину 25,4 мм. Его размеры искусственно увеличены примерно в 1,5 раза для удобства изображения текста на экране обычного размера (14 дюймов по диагонали).Если бы размер логического дюйма был равен в точности одному "физическому" дюйму, буквы, набранные шрифтом стандартного размера (порядка 10 - 12 пунктов) были бы слишком мелкими.


Содержание раздела