我在Google上搜索,查看了示例,此处的其他问题,MSDN和“已下载示例”代码。我无法弄清楚这有什么问题。

// setting up the memory DC and selecting in the bitmap
HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmLogo);

// setting up the blend function
BLENDFUNCTION bStruct;
bStruct.BlendOp = AC_SRC_OVER;
bStruct.BlendFlags = 0;
bStruct.SourceConstantAlpha = 255;
bStruct.AlphaFormat = AC_SRC_ALPHA;

// try
BOOL check = AlphaBlend(buffer.getBufferDC(), 0, 0, bitmap.bmLogo.bmWidth, bitmap.bmLogo.bmHeight, hdcMem, 0, 0, bitmap.bmLogo.bmWidth, bitmap.bmLogo.bmHeight, bStruct);
if (check == FALSE) MessageBox(0,0,0,0);

// this is how I load the bitmap, it is a resource.
bitmap.hbmLogo = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_LOGO_0));
if (bitmap.hbmLogo == NULL) { MessageBox(NULL, "Could not read the logo bitmap.", "Error", MB_OK); return false; }
GetObject(bitmap.hbmLogo, sizeof(bitmap.bmLogo), &bitmap.bmLogo);


我使用消息框快速检查结果。 Check始终返回TRUE。位图及其尺寸正确。

我已经尝试过使用不同的背景颜色,alpha值,但仍然一无所获,将其替换为BitBlt或TransparentBitBlt,没问题,徽标显示出来。我对AlphaBlend函数的所有尝试都没有导致任何改变。徽标在屏幕上甚至不会出现一秒钟。

有任何想法吗?

谢谢。

最佳答案

在仔细研究示例之后,找到了解决方案。

我将BLENDFUNCTION设置为全局变量,并在使用的WM_CREATE消息中:

    m_bf.BlendOp = AC_SRC_OVER;
    m_bf.BlendFlags = 0;
    m_bf.SourceConstantAlpha = 100; // any 0 to 255
    m_bf.AlphaFormat = 0;
    LoadBitmapsFromResource();


现在正在工作。

关于c++ - Win32 C++ Alphablend位图部分透明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21871411/

10-11 00:24