2010-07-23 140 views
2

我有一个应用程序在客户区显示为黑色的透明背景,因为窗口没有分层。在它的每个WM_PAINT消息中,我正在对内存DC执行BitBlt,之后,我将内存DC与UpdateLayeredWindow一起用于分层画布窗口。在16位桌面颜色深度的BitBlt + UpdateLayeredWindow和CreateDIBSection

设置的内存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函数到DC的信息复制应用程序的客户端区域内存DC。之后,我正在做一个UpdateLayeredWindow与内存DC到分层的画布窗口DC(其CWnd)。所以它是实时的,结果是:除了具有不规则形状和每像素透明度之外,我还有正常的应用程序窗口和分层窗口。

一切正常工作在32位桌面颜色深度!如果我切换到16位,分层画布窗口会变得混乱。绘图看起来很糟糕,整个窗口是可点击的。

它认为这是因为缺乏alpha通道信息。

所以我搜索了很多的解决方案。我发现在这种情况下我必须创建内存-DC与

HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

而不是CreateCompatibleDC(NULL)。因为兼容的DC会给我一个16位的DC。

使用CreateDC绘图效果更好。但是整个窗口仍然是可点击的,并且透明度在分层窗口中被绘制为黑色。

所以我认为问题是与BitBlt或CreateDIBSection的BitmapInfoHeader。

  1. 我不知道,如果使用BitmapInfoHeader.biBitCount = 32或BitmapInfoHeader.biBitCount = 16位。认为它是32.那么biCompression呢?> BI_RGB或BI_BITFIELDS?

  2. 如何将BitBlt(...,SRCCOPY)的16位DC添加到内存DC到内存DC,以便它可以与UpdateLayeredWindow一起使用? (也许:预先乘以alpha通道的rgb通道?)不知道该怎么做。


我有一点点接近16位桌面颜色深度的问题。

HDC hdcMemory = CreateCompatibleDC(NULL); 

以上似乎工作。但是我的UpdateLayeredWindow函数产生的结果看起来很乱。

所以,这是因为黑色缺失!每个全黑的像素都变得透明。你可以看透,然后点击。所有其他像素都会失去黑色部分,只能点击。

我做了一个测试:我打开了Windows Paint.exe,制作了一个窗口宽度和高度的表面,黑色作为填充颜色。

然后我把它放在我的分层窗口(缺失黑色)下,再次将分层窗口作为窗口窗口,ta-da,我的分层窗口看起来正常,并且通过Paint.exe黑色像素。

所以我用BitBlt和它的光栅操作参数再次验证。但没有运气。

如何在使用UpdateLayeredWindow绘图之前将黑色与BitBlt混合到DC中?

回答