我需要创建一个自定义控件来显示带有alpha通道的bmp图像。背景可以用不同的颜色绘制,图像具有阴影,因此我需要真正地“绘制”alpha通道。
有人知道如何做吗?
如果可能的话,我还想创建一个掩模,使用alpha通道信息来确定鼠标是点击了图像还是透明区域。
非常感谢任何形式的帮助!
谢谢。
编辑(JDePedro):正如你们中的一些人建议的那样,我一直在尝试使用Alpha混合来绘制具有Alpha通道的位图。这只是一个测试,我加载了一个32位位图资源,并尝试使用AlphaBlend函数进行绘制:
void CAlphaDlg::OnPaint()
{
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
int nWidth = BitMap.bmWidth;
int nHeight = BitMap.bmHeight;
CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);
BLENDFUNCTION m_bf;
m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha = 255;
m_bf.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(dc.GetSafeHdc(), 100, 100, nWidth, nHeight, dcMem.GetSafeHdc(), 0, 0,nWidth, nHeight,m_bf);
dcMem.SelectObject(pOldBitmap);
CDialog::OnPaint();
}
这只是一个测试,所以我将代码放在对话框的 OnPaint 中(我还尝试了 CDC 对象的 AlphaBlend 函数)。
非透明区域被正确绘制,但位图应该是透明的地方,出现了白色。
有什么帮助吗???
这是一个截图...不容易看到,但是蓝色圆圈周围有一个白色矩形:alt text http://img385.imageshack.us/img385/7965/alphamh8.png
好的。我懂了!我必须为每个像素的 alpha 值预先乘以它的值。有人可以建议一种优化的方法吗?
pStatic->SetBitmap(bitmap); - Michael Haephrati