首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

兼容dc显示透明bmp的有关问题

2012-03-08 
兼容dc显示透明bmp的问题我写了1个基于CStatic的类Bomb,想把这个类写成显示多桢透明bmp的功能。Bomb里面有:

兼容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只能创建单色位图

热点排行