Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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

© Александр Фролов, Григорий Фролов
Том 11, М.: Диалог-МИФИ, 1993, 269 стр.

[Назад] [Содеожание] [Дальше]

4.4. Приложение 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 800 x 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 пунктов) были бы слишком мелкими.

[Назад] [Содеожание] [Дальше]