BitBlt + UpdateLayeredWindow和16位桌面颜色深度的CreateDIBSection

我在客户区有一个透明背景的应用程序,因为窗口没有分层,所以它被绘制成黑色。在每个WM_PAINT消息中,我正在对一个内存DC执行BitBlt,之后我将带有UpdateLayeredWindow的内存DC用于分层画布窗口。 内存设置DC:
HDC hdcMemory = CreateCompatibleDC(NULL);
HBITMAP bmpMemory = CreateDIBSection(hdcMemory, (BITMAPINFO*)&m_BitmapInfoHeader,
DIB_RGB_COLORS, (void **)&m_pDIBSectionBits, NULL, (DWORD)0);
SelectObject(hdcMemory, bmpMemory);
在WM_PAINT中,我使用BitBlt函数将apps客户区DC信息复制到memory-DC。之后,我正在使用memory-DC对UpdateLayeredWindow进行分层画布窗口DC(它的CWnd)。所以它是实时的,结果是:我有一个普通的应用程序窗口和一个分层窗口,除了不规则的形状和每像素透明度。 在32位桌面颜色深度一切正常!如果我切换到16位,分层的画布窗口会搞砸。图纸看起来很糟糕,整个窗口都是点击式的。 它认为这是因为缺乏alpha通道信息。 所以我用Google搜索了一个解决方案。我发现在这种情况下我必须创建内存DC
HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
而不是CreateCompatibleDC(NULL)。因为兼容的DC会给我一个16位DC。 使用CreateDC绘图更好。但是整个窗口仍然是可点击的,并且在分层窗口中将透明度绘制为黑色。 所以我认为问题在于BitBlt或CreateDIBSection的BitmapInfoHeader。 我不知道是否使用BitmapInfoHeader.biBitCount = 32或BitmapInfoHeader.biBitCount = 16位。认为它是32.那么biCompression - > BI_RGB或BI_BITFIELDS呢? 如何在BitBlt(...,SRCCOPY)将16位DC连接到内存DC后将alpha通道信息添加到内存DC,以便它可以与UpdateLayeredWindow一起使用? (也许:预先将rgb通道与alpha通道相乘?)Dunno怎么做。 我更接近16位桌面颜色深度问题。
HDC hdcMemory = CreateCompatibleDC(NULL);
以上似乎都有效。但是我的UpdateLayeredWindow函数产生的结果看起来很乱。 所以,这是因为缺少黑色!每个全黑的像素都会变得透明。您可以看到并点击。所有其他像素失去了他们的黑色部分,只有点击通过。 我做了一个测试:我打开了Windows Paint.exe,制作了一个窗口宽度和高度的表面,黑色作为填充颜色。 然后我把它放在我的分层窗口(缺少黑色)下,再次将分层窗口作为forgeround窗口,ta-da,我的分层窗口与Paint.exe黑色像素的闪亮组合看起来正常。 所以我再次使用BitBlt和它的光栅操作参数进行过期。但没有运气。 在使用UpdateLayeredWindow绘图之前,如何将黑色与BitBlt混合到我的DC?     
已邀请:
看看这里: http://msdn.microsoft.com/en-us/library/aa453651.aspx 我确信,这是一个光栅操作问题。     

要回复问题请先登录注册