Окт 16

Создание DDB-растра из упакованного DIB

так, рассмотренные выше функции мало пригодны для создания инициализированных цветных DDB-растров. В то же время аппаратно-независимыи растр обладает хорошими средствами для описания стандартных цветовых форматов. Поэтому GDI содержит функцию CreateDIBitmap, которая создает инициализированный DDB-растр на базе DIB, то есть, по существу, преобразует упакованный DIB в DDB. Функция имеет следующий прототип:
HBITMAP CreateDIBitmap(HDC hdc. CONST BITMAPINFOHEADER Ipbmih.
DWORD fdwlnit. CONST VOID Ipblnit, CONST BITMAPINFO Ipbmi. UINT fuUsage):
В своей реализации она сначала создает DDB-растр, совместимый с контекстом устройства hdc, а затем преобразует DIB в DDB. Параметр Ipbmih содержит адрес заголовка информационного блока DIB. Параметр fdwlnit определяет необходимость инициализации DDB-растра. Если он равен CBM_INIT, то следующие три параметра ссылаются на упакованный DIB-растр, используемый для инициализации. Параметр Ipblnit указывает на массив пикселов, а параметр Ipbmi — на заголовок информационного блока DIB, преобразованный к типу BITMAPINFO. Последний параметр, fuUsage, сообщает, содержит цветовая таблица индексы палитры (DIB_PAL_C0L0RS) или цвета RGB (DIB_RGB_C0L0RS).
Честно говоря, не совсем понятно, для чего нужна эта функция, поскольку если DIB-растр загружен, как, например, в коде листинга 3.6, то никаких проблем с его выводом не будет. Для этого вызывается функция StretchDIBits (в классе KDib она инкапсулирована в метод Draw). Функция CreateDIBitmap позволяет преобразовать этот же DIB-растр, предварительно загруженный в память, в объект DDB-растра, который затем может быть отображен при помощи функции BitBlt (подробности вывода DDB-растров рассматриваются ниже). Но остается вопрос: а что дает эта более сложная схема?
Все же основные способы создания DDB-растров сводятся к рассматриваемым ниже двум функциям.