游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3249|回复: 6

晕哪!超级郁闷,看不明白,请各位老师讲解!

[复制链接]

2

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2004-11-19 17:04:00 | 显示全部楼层 |阅读模式
void TransparentBlt2( HDC hdc0,       
                                        int nX0,int nY0,
                                        int nW0,int nH0,
                                        HDC hdc1,
                                        int nX1,int nY1,
                                        int nW1,int nH1,
                                        UINT Tcol
                                        )
{        HBITMAP hBMP   =CreateCompatibleBitmap(hdc0,nW0, nH0);
        HBITMAP mBMP   =CreateBitmap(nW0,nH0,1,1,NULL);       
        HDC                hDC    =CreateCompatibleDC(hdc0);
        HDC                mDC    =CreateCompatibleDC(hdc0);
        HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
        HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
        if (nW0==nW1&&nH0==nH1)
                BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
        else
                StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);

        SetBkColor(hDC, Tcol);
        BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);
        SetBkColor(hDC, RGB(0,0,0));
        SetTextColor(hDC, RGB(255,255,255));
        BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
        SetBkColor(hdc0,RGB(255,255,255));       
        SetTextColor(hdc0,RGB(0,0,0));
        BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND);
        BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);

        SelectObject(hDC, oldBMP);                               
        DeleteDC(hDC);
        SelectObject(mDC, oldmBMP);
        DeleteDC(mDC);
        DeleteObject(hBMP);
        DeleteObject(mBMP);
}

这段代码是《学VC编游戏》的第四个例子,那么多参数是在不明白,请各位老师解释一下,这段代码的意思,越详细越好,我没有书的。 [em24] [em24]

5

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2004-11-19 17:27:00 | 显示全部楼层

Re:晕哪!超级郁闷,看不明白,请各位老师讲解!

这段是用来图片背景透明的

2

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2004-11-19 17:32:00 | 显示全部楼层

Re:晕哪!超级郁闷,看不明白,请各位老师讲解!

函数要实现的功能我知道,但就是看不明白到底怎么实现的,参数是怎么传的,里面调用的系统函数是什么意思呢?不知道您能不能帮忙解释一下呢?我将非常感谢。

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-11-19 18:24:00 | 显示全部楼层

Re:晕哪!超级郁闷,看不明白,请各位老师讲解!

不是打击你!你要是想看懂里面的函数的意思,先简单的学习一些Win32API吧!

1

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
QQ
发表于 2004-11-20 00:57:00 | 显示全部楼层

Re:晕哪!超级郁闷,看不明白,请各位老师讲解!

同楼上的建议~

思路楼主应该明白吧?而那些函数的作用MSDN中要比我解释的好~嘿嘿

3

主题

36

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2004-11-21 17:10:00 | 显示全部楼层

Re:晕哪!超级郁闷,看不明白,请各位老师讲解!

我的机器上空间少,没装MSDN,能否请高手简单解释一下先,
SetBkColor()和SetTextColor()及其参数的意义吗?多谢!!!

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2004-11-25 08:59:00 | 显示全部楼层

Re:晕哪!超级郁闷,看不明白,请各位老师讲解!

//**************************************************
//  TransparentBlt2 (......)透明显示
//  根据关键色,将hdc1中的图形在hdc0中
//  自动生成掩模,并生成透明图形。
//注:TransparentBlt(......)是一个WIN API函数,功能和这里的相同。在WIN2000和
//   以后的系统上可用。在WIN98中有严重的资源泄漏,根本不能用。
//   所谓的资源泄漏:
//                                        你把下面TransparentBlt2最后6句注释掉就可看到。
//   要使用TransparentBlt(......)前,请引用:
//   #include <wingdi.h>
//   #pragma comment (lib,"msimg32.lib")
//**************************************************
void TransparentBlt2( HDC hdc0,                // 目标DC
                                        int nX0,int nY0,// 目标偏移
                                        int nW0,int nH0,// 目标宽高度
                                        HDC hdc1,                // 源DC
                                        int nX1,int nY1,// 源起点
                                        int nW1,int nH1,// 源宽高度
                                        UINT Tcol                // 透明色,COLORREF类型
                                        )                        //透明显示[4章]
{//A、建立图形资源。
        HBITMAP hBMP   =CreateCompatibleBitmap(hdc0,nW0, nH0);        //创建位图内存
        HBITMAP mBMP   =CreateBitmap(nW0,nH0,1,1,NULL);                        //创建单色掩码位图
        HDC                hDC    =CreateCompatibleDC(hdc0);                                //创建设备句柄
        HDC                mDC    =CreateCompatibleDC(hdc0);                                //创建设备句柄
        HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
        HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
//B、拷贝或压缩拷贝源DC中的位图到临时hDC中。
        if (nW0==nW1&&nH0==nH1)
                BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
        else
                StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);
//C、生成掩码位图。
        SetBkColor(hDC, Tcol);// 设置透明色
        BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);// 生成白色透明区,其它区域为黑色的掩码位图
        SetBkColor(hDC, RGB(0,0,0));                        // 生成黑色透明区,其它区域保持不变的位图
        SetTextColor(hDC, RGB(255,255,255));        // 白色
        BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
        SetBkColor(hdc0,RGB(255,255,255));                // 透明部分保持屏幕不变,其它部分变成黑色
        SetTextColor(hdc0,RGB(0,0,0));                        // 黑色
//D、透明显示
        BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND);        //"与"运算,在hdc0生成掩模
        BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);        //"或"运算,生成最终透明效果       
//E、以下为释放资源
        SelectObject(hDC, oldBMP);                               
        DeleteDC(hDC);
        SelectObject(mDC, oldmBMP);
        DeleteDC(mDC);
        DeleteObject(hBMP);
        DeleteObject(mBMP);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 10:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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