【问题标题】:GDI, About alpha bitmapGDI,关于 alpha 位图
【发布时间】:2013-07-22 20:13:59
【问题描述】:

我的问题是: 选择一个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”字符串。为什么?

【问题讨论】:

    标签: c++ gdi


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      发生了转换,因为在兼容的 DC 中您无法拥有带有 Alpha 通道的位图。 (“兼容 DC”这个词很烂。它实际上是一个依赖于设备的 DC。)

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

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

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

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

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

      【讨论】:

      • 感谢您的详细回复。我曾尝试通过 SetTextColor 函数修改文本颜色,但还是不行。而我使用其他CDC的成员函数如memDC.FillSoildRect,它们也没有效果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 2014-08-01
      • 2011-01-09
      • 2018-12-13
      • 2010-11-13
      • 2016-06-15
      • 1970-01-01
      相关资源
      最近更新 更多