我想使CStatic控件上加载的Bmp图片背景透明,现在重写了OnDrawItem函数能够实现背景透明了。可是里边用到了MaskBlt函数,这个函数在win98下不工作,怎么能代替这个函数实现这个功能?
解决方案 »
- 求一个视频反交错的成型算法bob或者weave要能运行的示例
- 帮忙看一下一个SOCKET写的TCP程序
- CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
- 关于Multimedia timer 的疑问
- 北京公司业务拓展,招长期员工2-3名(C++开发工程师)
- 【求助】那位大哥有 赵荣椿等编著:数字图象处理导论,西北工业大学出版社,1996年 电子书?
- 请教高手,有关控件和命令行应用程序有何区别吗??
- 推荐一个广告的网站?
- 视图切换问题——切换后显示不正常!
- 几个基本问题
- vc 中TreeView 控件中,选中某一节点的复选框后,如何让它自动选中它的子节点的复选框?
- 复制库文件到指定目录,帖代码
假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。用VC++ MFC实现的代码如下:void CDemoDlg::OnPaint()
{
CPaintDC dc(this); Cbitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB; BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图 BmpA.LoadBitmap(IDB_BITMAPA); //载入图A BmpB.LoadBitmap(IDB_BITMAPB); //载入图B CDC dcBack,dcA,dcB; //声明三个内存DC用于画图 dcBack.CreateCompatibleDC(&dc); dcA.CreateCompatibleDC(&dc); dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC pOldBack=dcBack.SelectObject(&BmpBack); pOldA=dcA.SelectObject(&BmpA); pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A
dcBack.SelectObject(pOldBack);
dcBack.SelectObject(pOldA);
dcBack.SelectObject(pOldB); //从内存DC中删除位图
} 你会看到红色的字母A透明地画在背景上了。用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。用VC++ MFC实现的代码如下,这是一个用来画透明位图的函数:CDC *pDC 需要画位图的CDC指针,
UINT IDImage 位图资源ID,
Crect &rect 指定位图在pDC中的位置,
COLORREF rgbMask 位图的透明色 void DrawTransparentBitmap(CDC *pDC, UINT IDImage,Crect &rect, COLORREF rgbMask)
{
CDC ImageDC,MaskDC; Cbitmap Image,*pOldImage; Cbitmap maskBitmap,*pOldMaskDCBitmap ; Image.LoadBitmap(IDImage); ImageDC.CreateCompatibleDC(pDC); pOldImage=ImageDC.SelectObject(&Image); MaskDC.CreateCompatibleDC(pDC); maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL ); pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap ); ImageDC.SetBkColor(rgbMask); MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY ); ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND); pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT); MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
}void CDemoDlg::OnPaint()
{
CPaintDC dc(this);
Cbitmap BmpBack,*pOldBack,; BmpBack.LoadBitmap(IDB_BACKGROUND); CDC dcBack;
dcBack.CreateCompatibleDC(&dc); pOldBack=dcBack.SelectObject(&BmpBack);
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));
dcBack.SelectObject(pOldBack);
}
五毛~~~~~谢谢你,用你的第二种方法能够实现,但是显示出来的位图比我预期的稍微偏左上的位置,在右下多出来的地方是黑色的框框,怎么办?