GDI,关于alpha位图

时间:2013-07-23 16:19:01

标签: c++ gdi

我的问题是: 将alpha位图选入内存DC后,再使用DrawText函数,但文本无法显示。

代码如下:

CDC memDC;
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc,64,100);
CBitmap *oldmemBitmap=(CBitmap*)memDC.SelectObject(&memBitmap);

CDC memDC1;
memDC1.CreateCompatibleDC(&dc);
//m_bitmap has alpha channel   64*64
CBitmap *oldmemBitmap1=(CBitmap*)memDC1.SelectObject(&m_bitmap);
memDC.BitBlt(0, 0, 64, 64, &memDC1, 0, 0, SRCCOPY);


CString str = _T("TEST");
memDC.DrawText(str,str.GetLength(),CRect(0,64,64,36),DT_CENTER|DT_WORDBREAK|DT_NOCLIP);

memDC.SelectObject(oldmemBitmap);

BITMAP bmpData;
memBitmap.GetBitmap(&bmpData);
CImageList imageList;
imageList.Create(bmpData.bmWidth, bmpData.bmHeight, ILC_COLOR32|ILC_MASK, 0, 1);
imageList.Add(&memBitmap, RGB(0, 0, 0));
POINT pt = {0, 0};
imageList.Draw(&dc, 0, pt, ILD_NORMAL);

可以正确显示m_bitmap,但“TEST”字符串不能。当我评论memDC.BitBlt(...)时,可以显示“TEST”字符串。为什么?

2 个答案:

答案 0 :(得分:0)

我的第一个猜测:检查在您的上下文中选择的设备字体,颜色和背景颜色。

“DrawText函数使用设备上下文选择的字体,文本颜色和背景颜色来绘制文本。” 请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498%28v=vs.85%29.aspx

由于某种原因,也许你的颜色与背景颜色相同,或类似的东西。 我排除了你的位图的alpha通道指定总透明度的可能性。在这种情况下,文本也不会出现。

答案 1 :(得分:0)

问题中没有足够的信息可以明确回答发生了什么,但我可以采取一些有根据的猜测。

除极少数例外情况外,GDI不会处理,尊重或保留Alpha通道。当你这样做时:

CBitmap *oldmemBitmap1=(CBitmap*)memDC1.SelectObject(&m_bitmap);

发生了转换,因为您无法在兼容的DC中使用带有Alpha通道的位图。 (“兼容的DC”是一个糟糕的术语。它实际上是一个依赖于设备的DC。)

BitBlt将现在不透明的位图复制到另一个DC。所以现在你在memDC中有一个不透明的位图 - 我猜它主要是黑色的。

然后你在它上面绘制文字。我猜这个文字也是黑色的,所以你现在在黑色背景上有黑色文字。

然后将位图添加到图像列表,告诉图像列表屏蔽掉所有黑色像素,包括文本和背景。因此,您看不到文本。你也没有看到背景,但我怀疑你没想到因为alpha通道(实际上丢失了)而看到背景。

当您注释掉BitBlt时,您最终会得到一个未初始化的背景(可能不是黑色)并在其上绘制黑色文本。然后将其添加到图像列表中,遮盖黑色。文本似乎只是因为它与不透明的背景形成鲜明对比。

所以回答“为什么?”。我现在假设您想知道如何处理它。为此,我们需要更多关于您希望发生什么的信息。