Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绘制具有透明度的位图_C++_Winapi_Bitmap_Gdi - Fatal编程技术网

C++ 绘制具有透明度的位图

C++ 绘制具有透明度的位图,c++,winapi,bitmap,gdi,C++,Winapi,Bitmap,Gdi,我正在创建一个用户界面,并以这种方式实际绘制位图: HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP oldBmp = (HBITMAP)SelectObject(hdcMem, mouseover? bitmapover:bitmap); StretchBlt(hdc, xabs, yabs, width, height, hdcMem, 0, 0, worg, horg, SRCCOPY); SelectObject(hdcMem, o

我正在创建一个用户界面,并以这种方式实际绘制位图:

HDC hdcMem = CreateCompatibleDC(hdc);

HBITMAP oldBmp = (HBITMAP)SelectObject(hdcMem, mouseover? bitmapover:bitmap);    

StretchBlt(hdc, xabs, yabs, width, height, hdcMem, 0, 0, worg, horg, SRCCOPY);

SelectObject(hdcMem, oldBmp);
DeleteDC(hdcMem);

但我只能画平面图像,我需要画透明的(几个alpha级别)。我用
GetDIBits
SetDIBits
尝试了一些东西,但没有画出任何东西。我可以使用png或逐像素修改位图,这更简单,我只是想避免使用带有DLL或限制性许可证的库。

要绘制半透明位图,您可以使用。请注意,使用此API绘制的带有alpha通道的位图需要具有预乘alpha。

使用OpenGL,没有许可证或真正的库使用没有背景的PNG文件。在中创建它Photoshop@Mikhail:我不相信您可以将OpenGL渲染上下文alpha混合到本机窗口中。即使是这样,OpenGL也非常复杂,而且在使用alpha透明度渲染图像这样简单的事情上使用起来非常昂贵。这是30年前的代码。GDI被30年历史的硬件所束缚,它被限制为24bpp像素格式,这使得透明效果很痛苦。从那以后情况确实有所改善,Windows内置了对PNG解码和32bpp格式的支持,并带有alpha通道。有关为什么要使用预乘alpha的解释,请参见。