Как я могу создать 32B HBITMAP и HDC
независимо от глубины цвета экрана?
все просто:
BITMAPINFO bmp_info = {};
bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmp_info.bmiHeader.biWidth = width;
bmp_info.bmiHeader.biHeight = height;
bmp_info.bmiHeader.biPlanes = 1;
bmp_info.bmiHeader.biBitCount = 32;
bmp_info.bmiHeader.biCompression = BI_RGB;
HDC mem_dc = CreateCompatibleDC(0);
void *dummy;
HBITMAP bitmap_handle = CreateDIBSection(mem_dc, &bmp_info, DIB_RGB_COLORS, &dummy, NULL, 0);
SelectObject(mem_dc, bitmap_handle));
Теперь нарисуйте вашу кнопку над этим DC. Не забудьте проверить на наличие ошибок и освободить ресурсы.
Или, в качестве альтернативы, автоматически преобразуйте ссылочный вид кнопки в режим рабочего стола:
HWND desktop = GetDesktopWindow();
HDC desktop_dc = GetDC(desktop);
HDC mem_dc = CreateCompatibleDC(desktop_dc);
RECT rect;
GetClientRect(desktop, &rect);
HBITMAP bitmap_handle = CreateCompatibleBitmap(desktop_dc, rect.right - rect.left, rect.bottom - rect.top);
SelectObject(mem_dc, bitmap_handle);
и теперь BitBlt ваше предварительно загруженное изображение выше mem_dc
. Он будет автоматически преобразован в текущий цветовой режим рабочего стола