Я не могу точно сказать, почему код не работает, но я знаю из недавнего опыта, что AlphaBlend очень требователен к растровым форматам, которые он принимает.К счастью, я могу предоставить некоторый рабочий код, который должен быть адаптирован к другим обстоятельствам.
static void DrawBitmapWithAlpha(HDC aDeviceContext,const CartoType::TBitmap* aBitmap,const CartoType::TRect& aDestRect,const CartoType::TRect& aSourceRect)
{
HDC hdc = CreateCompatibleDC(aDeviceContext);
BITMAPINFOHEADER bitmap_header;
memset(&bitmap_header,0,sizeof(bitmap_header));
bitmap_header.biSize = sizeof(BITMAPINFOHEADER);
bitmap_header.biWidth = aBitmap->Width();
bitmap_header.biHeight = aBitmap->Height();
bitmap_header.biPlanes = 1;
bitmap_header.biBitCount = 32;
bitmap_header.biCompression = BI_RGB;
bitmap_header.biSizeImage = 0;
bitmap_header.biXPelsPerMeter = 1000;
bitmap_header.biYPelsPerMeter = 1000;
bitmap_header.biClrUsed = 0;
bitmap_header.biClrImportant = 0;
void* bitmap_data = NULL;
HBITMAP hbitmap = CreateDIBSection(hdc,(const BITMAPINFO*)&bitmap_header,DIB_RGB_COLORS,&bitmap_data,NULL,0);
// Reflect the data vertically and change from ABGR to BGRA.
unsigned char* dest_row = (unsigned char*)bitmap_data;
const unsigned char* source_row = aBitmap->Data() + (aBitmap->Height() - 1) * aBitmap->RowBytes();
for (int y = 0; y < aBitmap->Height(); y++, dest_row += aBitmap->RowBytes(), source_row -= aBitmap->RowBytes())
{
const unsigned char* p = source_row;
unsigned char* q = dest_row;
unsigned char* end = q + aBitmap->RowBytes();
while (q < end)
{
*q++ = p[1];
*q++ = p[2];
*q++ = p[3];
*q++ = p[0];
p += 4;
}
}
SelectObject(hdc,hbitmap);
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xFF;
bf.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(aDeviceContext,aDestRect.Left(),aDestRect.Top(),aDestRect.Width(),aDestRect.Height(),
hdc,aSourceRect.Left(),aSourceRect.Top(),aSourceRect.Width(),aSourceRect.Height(),
bf);
DeleteObject(hbitmap);
DeleteDC(hdc);
}
Раздел, начинающийся с «отражать данные по вертикали», можно легко изменить, чтобы сделать все необходимое для копирования ваших растровых данных врастровое изображение, созданное CreateDIBSection.
Мой формат растрового изображения совместим с Windows в том смысле, что число байтов строки всегда будет одинаковым;если у вашего растрового формата нет этого свойства, вам нужно изменить код, чтобы соответствующим образом скопировать данные.
Еще один полезный момент: я не смог заставить это работать с битовыми полями;и я также подозреваю, что вам нужно предоставить битовую карту 32bpp со сжатием, установленным в BI_RGB.