兼容dc显示透明bmp的问题
我写了1个基于CStatic的类Bomb,想把这个类写成显示多桢透明bmp的功能。
Bomb里面有:
2个CBitmap成员bkg和bmp,bkg用来保存父窗口的原始区域图,因为父窗口的显示不是静态的,bmp用来读入当前要显示的图片。
2个CDC成员memdc和tmpdc,我把它们当缓存用,在memdc中画好之后再复制到窗口dc中。
步骤:
1. 保存好背景到bkg中;
2. 复制bkg到tmpdc中;
3. 从tmpdc复制(bitblt)到memdc中;(不能直接选bkg到memdc,否则bkg内容会被改变)
4. 读入要显示的桢到bmp中,在复制到tmpdc中;
5. 从tmpdc用Transparentblt复制到memdc中;
6. 最后把memdc中的内容复制到窗口dc中显示。
现在问题是经过上面的步骤,显示出来基本上是黑的,乱七八糟,但是直接把bkg选入memdc再bitblt到窗口dc,然后tmpdc读入bmp再Transparentblt到窗口dc可以正常显示,这是为什么?(因为感觉经过了2次直接对窗口dc输出会造成闪烁,所以我想先都在memdc中处理好在向窗口dc一次输出,但是又不能直接把bkg选入memdc,原因如上)
下为代码:
void Bomb::Display(UINT hbmp)
{
CBitmap* old, *oldbmp;
BOOL b=bmp.LoadBitmap(hbmp);
CClientDC dc(this);
CDC tmpdc;
b=tmpdc.CreateCompatibleDC(&dc);
tmpbmp.CreateCompatibleBitmap(&tmpdc,128,128);
old=memdc.SelectObject(&tmpbmp);
oldbmp=tmpdc.SelectObject(&bkg);
memdc.BitBlt(0,0,128,128,&tmpdc,0,0,SRCCOPY);
tmpdc.SelectObject(bmp);
::TransparentBlt(memdc.m_hDC,0,0,128,128,tmpdc.m_hDC,0,0,128,128,RGB(0,0,255));
dc.BitBlt(0,0,128,128,&memdc,0,0,SRCCOPY);
memdc.SelectObject(old);
tmpdc.SelectObject(oldbmp);
tmpbmp.Detach();
bmp.Detach();
}
难道是不能对一个memdc进行2次复制bitblt+transparentblt吗?或者是tmpdc的2次selectobject有问题?
[解决办法]
tmpbmp.CreateCompatibleBitmap(GetDC(),128,128);
[解决办法]
这里用GetDC()是假设你在窗口类里面调用,否则要得到合适的窗口的DC,而不是像你这样直接用内存DC来创建内存位图。
[解决办法]
tmpdc是内存DC只能创建单色位图