0

我的问题是:在内存 DC 中选择一个 alpha 位图后,然后使用 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”字符串。为什么?

4

2 回答 2

0

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

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

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

于 2013-07-23T16:45:55.847 回答
0

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

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

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

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

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

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

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

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

所以这回答了“为什么?”。我想现在你想知道该怎么做。为此,我们需要有关您希望发生的事情的更多信息。

于 2013-07-23T18:18:56.897 回答