Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.10 Битовый образ — объект gdi

Формат битового образа, предложенный в Windows 1.0, очень ограничен и почти полностью зависит от устройства вывода, для которого он создан. Для хранения файлов битовых образов на диске вам следует использовать формат DIB, а не устаревший формат битового образа. Однако, когда вам необходим битовый образ исключительно для использования в вашей программе, работа с битовым образом, зависящим от устройства, окажется значительно проще и производительней.

4.10.1 Создание битовых образов в программе

Windows содержит пять функций, которые позволяют вам в программе создать зависящий от устройства битовый образ — объект GDI. Первая функция CreateDIBitmap рассматривалась выше. Вот другие функции:

hBitmap = CreateBitmap(cxWidth, cyHeight, iPlanes, iBitsPixel, pBits);

hBitmap = CreateBitmapIndirect(&bitmap);

hBitmap = CreateCompatibleBitmap(hdc, cxWidth, cyHeight);

hBitmap = CreateDiscardableBitmap(hdc, cxWidth, cyHeight);

Во всех случаях параметры cxWidth и cyHeight — это ширина и высота битового образа в пикселях. В функции CreateBitmap параметры iPlanes и iBitsPixel — это число цветовых плоскостей и число битов цвета на пиксель в битовом образе. Хотя бы один из этих двух параметров должен быть равен 1. Если оба параметра равны 1, то функция строит монохромный битовый образ. (Мы вскоре остановимся на том, как цветовые плоскости и биты цвета представляют цвет.)

В функции CreateBitmap параметр pBits может быть установлен в NULL, если вы создаете неинициализированный битовый образ. Созданный битовый образ будет содержать случайные данные. В функциях CreateCompatibleBitmap и CreateDiscardableBitmap Windows использует контекст устройства, описываемый параметром hdc, для получения числа цветовых плоскостей и числа битов цвета на пиксель. Битовый образ, создаваемый этими функциями, будет неинициализированным.

Функция CreateBitmapIndirect схожа с функцией CreateBitmap за исключением того, что она использует структуру типа BITMAP для задания битового образа. Следующая таблица показывает поля этой структуры:

Поле bmWidthBytes должно быть четным числом — минимальным четным числом байтов, необходимым для хранения одной скан-линии. Массив битов, на который указывает bmBits, должен быть организован на базе поля bmWidthBytes. Если bm — структура типа BITMAP, то вы можете вычислить значение поля bmWidthBytes, используя следующее выражение:

bm.bmWidthBytes =(bm.bmWidth * bm.bmBitsPixel + 15) / 16 * 2;

Если Windows не может создать битовый образ (в основном из-за недостатка памяти), она возвратит NULL. Вам следует проверять возвращаемые значения каждой из функций создания битовых образов, особенно, если вы строите большие битовые образы.

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

GetObject(hBitmap, sizeof(BITMAP),(LPVOID) &bitmap);

Эта функция копирует информацию о битовом образе в структуру (с именем bitmap) типа BITMAP. Эта функция не устанавливает поле bmBits. Для доступа к битам битового образа вам нужно вызвать функцию:

GetBitmapBits(hBitmap, dwCount, pBits);

Она копирует dwCount бит в символьный массив по указателю pBits. Для того, чтобы быть уверенными, что все биты битового образа скопируются в этот массив, вы можете вычислить параметр dwCount на основе значений полей структуры битового образа:

dwCount =(DWORD) bitmap.bmWidthBytes * bitmap.bmHeight * bitmap.bmPlanes;

Вы можете также задать Windows скопировать массив, содержащий биты битового образа, обратно в существующий битовый образ, используя функцию:

SetBitmapBits(hBitmap, dwCoint, pBits);

Поскольку битовые образы — это объекты GDI, вы должны удалить каждый созданный вами битовый образ:

DeleteObject(hBitmap);

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