游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6998|回复: 9

有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透明

[复制链接]

12

主题

92

帖子

97

积分

注册会员

Rank: 2

积分
97
QQ
发表于 2003-10-23 21:23:00 | 显示全部楼层 |阅读模式
有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透明色?我要用位图做一个SPRITE,谢谢。

45

主题

286

帖子

314

积分

中级会员

自由游戏制作人

Rank: 3Rank: 3

积分
314
QQ
发表于 2003-10-23 22:08:00 | 显示全部楼层

Re: 有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

(原创(net_sky))
在GDI里有一个函数BitBlt()
他的用法如下
BOOL BitBlt(
int x,               //帖到目的地左上角点的x坐标
int y,               //帖到目的地左上角点的y坐标
int nWidth,      //贴到目的地的宽度
int nHeight,     //帖到目的地的高度
CDC* pSrcDC,  //储存来源位图的DC
int xSrc,          //源位图的左上角点的x坐标
int ySrc,          //源位图的左上角点的y坐标
DWORD dwRop //Raster运算值
);

最后一个参数dwRop就是Raster的运算值,就是设置位图帖到目的DC的方式。

要制作镂空图,要按以下两个步骤:
1.使用BitBlt函数将蒙版与背景图做AND运算,贴到目的地DC中。
2.再以要镂空的图与背景图做OR运算,帖到目的地的DC中。

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2003-10-23 22:41:00 | 显示全部楼层

Re: 有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

使用AlphaBind

13

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2003-10-24 00:52:00 | 显示全部楼层

Re:有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

void DrawTransparent(int x,int y,CDC *pDC,CBitmap *pBitmap,COLORREF Color,CRect* rect)
{
        BITMAP bm;
        pBitmap->GetObject(sizeof(BITMAP),&bm);
        CDC ImageDC;
        ImageDC.CreateCompatibleDC(pDC);
        CBitmap *pOldImageBitmap=ImageDC.SelectObject(pBitmap);
        CDC MaskDC;
        MaskDC.CreateCompatibleDC(pDC);
        CBitmap MaskBitmap;
        MaskBitmap.CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL);
        CBitmap *pOldMaskBitmap=MaskDC.SelectObject(&MaskBitmap);
        ImageDC.SetBkColor(Color);
        MaskDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&ImageDC,0,0,SRCCOPY);
        CDC OrDC;
        OrDC.CreateCompatibleDC(pDC);
        CBitmap OrBitmap;
        OrBitmap.CreateCompatibleBitmap(&ImageDC,bm.bmWidth,bm.bmHeight);
        CBitmap *pOldOrBitmap=OrDC.SelectObject(&OrBitmap);
        OrDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&ImageDC,0,0,SRCCOPY);
        OrDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MaskDC,0,0,0x220326);
        CDC TempDC;
        TempDC.CreateCompatibleDC(pDC);
        CBitmap TempBitmap;
        TempBitmap.CreateCompatibleBitmap(&ImageDC,bm.bmWidth,bm.bmHeight);
        CBitmap *pOldTmepBitmap=TempDC.SelectObject(&TempBitmap);
        TempDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,pDC,x,y,SRCCOPY);
        TempDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MaskDC,0,0,SRCAND);
        TempDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&OrDC,0,0,SRCPAINT);
        if (rect!=NULL)
                pDC->BitBlt(x,y,rect->Width(),rect->Height(),&TempDC,rect->left,rect->top,SRCCOPY);
    else
                pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&TempDC,0,0,SRCCOPY);
           TempDC.SelectObject(pOldTmepBitmap);
        OrDC.SelectObject(pOldOrBitmap);
        MaskDC.SelectObject(pOldMaskBitmap);
        ImageDC.SelectObject(pOldImageBitmap);
}

12

主题

92

帖子

97

积分

注册会员

Rank: 2

积分
97
QQ
 楼主| 发表于 2003-10-24 08:39:00 | 显示全部楼层

Re:有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

谢谢各位大哥,不盛感激

12

主题

92

帖子

97

积分

注册会员

Rank: 2

积分
97
QQ
 楼主| 发表于 2003-10-24 09:00:00 | 显示全部楼层

Re:有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

呵呵,我试了,不用那么麻烦的,位图的底色用纯白,dwRop参数用 SRCAND就行了。呵呵,再次谢谢各位哥哥

12

主题

92

帖子

97

积分

注册会员

Rank: 2

积分
97
QQ
 楼主| 发表于 2003-10-24 13:37:00 | 显示全部楼层

Re:有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

呵呵,单用AND是不行的,范了个低级错误

13

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2003-10-24 22:29:00 | 显示全部楼层

Re:有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

直接用我给你的函数是了
void DrawTransparent(int x,int y,CDC *pDC,CBitmap *pBitmap,COLORREF Color,CRect* rect)
第1,2是目标位置的坐标
3是设备场境,4是位图对象指针
4是要滤掉的颜色,5个是源图上要绘上去的区域

12

主题

92

帖子

97

积分

注册会员

Rank: 2

积分
97
QQ
 楼主| 发表于 2003-10-27 20:20:00 | 显示全部楼层

Re: 有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

银,谢谢你,你用的是MFC的,我没使用MFC

10

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2003-10-27 20:59:00 | 显示全部楼层

Re:有谁知道用GDI如何设置透明色吗?或者GDI中有指定的透

只用SRCAND是不行的,呵呵
因为不是白色的部分即SPRITE会和背景AND,颜色就不对了。
GDI的话我建议使用net_sky老兄的做法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-23 20:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表