Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Graph.doc
Скачиваний:
19
Добавлен:
14.05.2015
Размер:
238.59 Кб
Скачать

Отображение битовых массивов

Графические возможности Windows были бы существенно ограничены, если бы допускали рисование только геометрических фигур или только отображение и копирование растровых (точечных) изображений. Система Windows и вместе с ней класс CDC предоставляют набор достаточно мощных функции, которые позволяют выводить любые рисунки, дополнительно масштабируя их или осуществляя вращение. (К сожалению, последняя возможность есть только в Windows NT – функция PlgBlt.)

Функции, использующие битовые массивы

Функции этой группы применяются для отображения отдельных точек (GetPixel, SetPixel и SetPixelV) или массивов точек, задаваемых битовыми массивами. Отдельно отметим функции копирования и преобразования битовых массивов, а также функции закрашивания замкнутых областей. Функция PatBlt используется для создания массива точек, который формируется в результате комбинации текущей кисти и содержимого области вывода (текущего заполнения).

BOOL CDC::PatBlt(int x, int у, int nWidth, int nHeight, DWORD dwRop)

Параметр dwRop определяет режим комбинирования текущей кисти и содержимого области, задаваемой параметрами х, у, nWidth и nHeight. Возможны следующие режимы:

  • PATCOPY – заполнение области при помощи текущей кисти;

  • PATINVERT – комбинирование текущего заполнения с кистью при помощи оператора XOR;

  • DSTINVERT – инвертирование текущего заполнения;

  • BLACKNESS – заданная область закрашивается сплошным черным цветом;

  • WHITENESS – заданная область закрашивается сплошным белым цветом;

  • PATPAINT – комбинирование инвертированного битового массива с текущей кистью при помощи оператора OR и комбинирование результата этой операции с текущим заполнением при помощи оператора OR.

Не все устройства поддерживают выполнение функции PatBlt. Для определения поддержки необходимо проверить результат вызова функции GetDeviceCaps с параметром RASTERCAPS (флаг RC_BITBLT).

Функция BitBlt копирует битовый массив из одного контекста устройства в другой.

BOOL CDC::BitBlt(int x, int у, int nWidth, int nHeight,

CDC* pSrcDC, int ySrc, DWORD dwRop)

Параметр dwRop определяет растровую операцию, используемую при копировании битового массива из контекста устройства, заданного параметром pSrcDC. в область, задаваемую параметрами х, у, nWidth и nHeight. Параметры xSrc и ySrc задают верхний левый угол области контекста устройства источника, который и определяет копируемый битовый массив. Для операций, не требующих битового массива в качестве источника, параметр pSrcDC должен быть равен NULL. Возможно использование следующих растровых операций:

  • BLACKNESS – тo же, что и для функции PatBlt;

  • DSTINVERT – тo же, что и для функции PatBlt;

  • MERGECOPY – комбинирование текущего заполнения с текущей кистью при помощи оператора AND;

  • MERGEPAINT – комбинирование инвертированного битового массива с текущим заполнением при помощи оператора OR;

  • NOTSRCCOPY – копирование инвертированного битового массива;

  • NOTSRCERASE – инвертирование результата комбинирования текущего заполнения с битовым массивом при помощи оператора OR

  • PATCOPY – тo же, что и для функции PatBlt;

  • PATINVERT – тo же, что и для функции PatBlt

  • PATPAINT – тo же, что и для функции PatBlt

  • SRCAND – комбинирование текущего заполнения и битового массива при помощи операции AND;

  • SRCCOPY – заполнение заданной области битовым массивом;

  • SRCERASE – комбинирование битового массива и инвертированного текущего заполнения при помощи операции AND;

  • SRCINVERT – комбинирование битового массива и текущего заполнения при помощи операции XOR;

  • SRCPAINT – комбинирование битового массива и текущего заполнения при помощи операции OR;

  • WHITENESS – тo же, что и для функции PatBlt.

Данная функция выполняется существенно быстрее для окон, имеющих стили CS_BYTEALIGNWINDOW или CS_BYTEALIGNCLIENT. Для указания этих стилей необходимо зарегистрировать класс окна при помощи глобальной функции MFC ::AfxRegisterWndClass.

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

Не все устройства поддерживают выполнение функции BitBlt. Для определения поддержки необходимо проверить результат вызова функции GetDeviceCaps с параметром RASTERCAPS (флаг RC_BITBLT).

Функция StretchBlt копирует битовый массив одного контекста в другой, изменяя размеры.

BOOL CDC::StretchBlt (int х, int у,

int nWidth, int nHeight,

CDC* pSrcDC,

int xSrc, int ySrc,

int nSrcWidth, int nSrcHeight,

DWORD dwRop)

Функция копирует битовый массив из контекста устройства, заданного параметром pSrcDC, в область, задаваемую параметрами х, у, nWidth и nHeight. Параметры xSrc и ySrc определяют верхний левый угол области контекста устройства источника, а параметры nSrcWidth и nSrcHeight размеры битового массива. Если эти параметры имеют разные знаки, то исходный битовый массив отображается зеркально по оси х. Если параметры nHeight и nSrcHeight имеют разные знаки, то исходный битовый массив отображается зеркально по оси у.

При уменьшении или увеличении образа используется режим преобразования, заданный функцией CDC::StretchBltMode.

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

Функция осуществляет масштабирование битового массива в памяти и только потом выполняет копирование (с учетом заданного растрового режима) в контекст устройства.

Не все устройства поддерживают выполнение функции StretchBlt. Для определения поддержки необходимо проверить результат вызова функции GetDeviceCaps с параметром RASTERCAPS (флаг RC_STRETCHBLT).

Следующая функция обеспечивает закрашивание произвольных областей с использованием текущей кисти:

BOOL CDC::ExtFloodFill(int x, int у,

COLORREF crColor,

UINT nFillType)

Она возвращает TRUE при успешном завершении и FALSE в случае возникновения ошибки. Закрашивание невозможно, если определяющий область закрашивания пиксел, координаты которого заданы параметрами х и у, имеет цвет, совпадающий с crColor, – при режиме закрашивания FLOODFILLBORDER, имеет цвет, не совпадающий с crColor, – при режиме закрашивания FLOODFILLSURFACE или если пиксел находится вне области отсечения.

Параметр crColor определяет либо цвет границы области, либо цвет самой области, что зависит от значения режима определения области закрашивания, задаваемого параметром nFillType. Всего возможны два режима определения области закрашивания:

  • FLOODFILLBORDER – область закрашивания определяется границей, цвет которой задается параметром crColor, этот режим обеспечивается также вызовом функции CDC:: FloodFill;

  • FLOODFILLSURFACE – область закрашивания определяется цветом, заданным параметром crColor, этот режим полезен для закрашивания областей, граничащих с областями разных цветов.

Функция CDC::ExtFloodFill поддерживается только контекстами устройств в памяти и растровыми устройствами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]