游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2612|回复: 4

关于半透明的问题!

[复制链接]

3

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2010-5-22 15:03:00 | 显示全部楼层 |阅读模式
已经实现了半透明效果
#ifndef AFX_STDAFX_H__E7587926_FDD5_43a2_B7AE_E3E72DC2ED3E_INCLUDED_
#define AFX_STDAFX_H__E7587926_FDD5_43a2_B7AE_E3E72DC2ED3E_INCLUDED_

#if _MSC_VER > 1000 //编译器版本大于1.0
#pragma once //程序运行1次
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN //不使用MFC库

#include <Windows.h>
#include "resource.h"
#include <cassert>

#define  NULL 0
static const int Num = 4;

static HBITMAP _fog[Num];//定义Num片雾气

const int xstart = 10;//初始化透明区域x轴位置
const int ystart = 10;//初始化透明区域y轴位置

class Game_Eight
{
public:
        Game_Eight();//构造函数
        ~Game_Eight();//析构函数
        void mypaint(HWND hwd);//载入背景
//protected:
private:
        //TOD
};

#endif

void Game_Eight::mypaint(HWND hwd)
{
       
        BITMAP bm1,bm2;//位图结构体
        unsigned char *px1,*px2;//无符号指针存储位图数据
        int x=0,y=0,rgb_b=0;

        RECT rect;
        GetClientRect(hwd,&rect);

        int xend = xstart+Num*200;//结束透明区域x轴位置
        int yend = ystart+130;//结束透明区域y轴位置

        HDC hdc = GetDC(hwd);
        HDC mdc = CreateCompatibleDC(hdc);
        HDC buf = CreateCompatibleDC(hdc);
        HBITMAP fog = CreateCompatibleBitmap(hdc,Num*200,130);
       
HBITMAP bitmap = (HBITMAP)LoadImage(NULL,"..//bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
        for (int i=0;i<Num;i++)
        {
                _fog =(HBITMAP)LoadImage(NULL,"..//wuqimask1.bmp",IMAGE_BITMAP,400,130,LR_LOADFROMFILE);
        }

        GetObject(bitmap,sizeof(BITMAP),&bm1);//将指针向位图结构获取数据
       
        //先在临时内存空粘结 //在临时内存中进行透明处理
        SelectObject(mdc,fog);       
        SelectObject(buf,bitmap);
        BitBlt(mdc,0,0,Num*200,130,buf,xstart,ystart,SRCCOPY);

        for (int k=0;k<Num;k++)
        {
                SelectObject(buf,_fog[k]);
                BitBlt(mdc,k*50,0,200,130,buf,200,0,SRCAND);
                BitBlt(mdc,k*50,0,200,130,buf,0,0,SRCPAINT);
        }

        if (bm1.bmBitsPixel != 32 && bm1.bmBitsPixel != 24)
        {
                MessageBox(NULL,"该程式只能在32位或者24位环境中运行!","警告",0);//默认是MB_OK
                return;//返回
        }
       
        px1 = new unsigned char[bm1.bmHeight*bm1.bmWidthBytes];//创建与位图空间一样的无符号字符数组
        assert(px1 != NULL);       
        GetBitmapBits(bitmap,bm1.bmHeight*bm1.bmWidthBytes,px1);//获取指针的值//这是唯一一个与16位windows兼容
       
        int pxByte = bm1.bmBitsPixel/8;
       
        //处理背景
        for (y= ystart;y<yend;y++)
        {
                for (x= xstart;x<xend;x++)
                {
                        rgb_b = y*bm1.bmWidthBytes+x*pxByte;//计算索引值,即下标.
                        px1[rgb_b] = unsigned char(px1[rgb_b]*0.7);
                        px1[rgb_b+1] = unsigned char(px1[rgb_b+1]*0.7);
                        px1[rgb_b+2] = unsigned char(px1[rgb_b+2]*0.7);
                }
        }

        GetObject(fog,sizeof(BITMAP),&bm2);
        px2 = new unsigned char[bm2.bmHeight*bm2.bmWidthBytes];
        assert(px2 != NULL);
       
        GetBitmapBits(fog,bm2.bmHeight*bm2.bmWidthBytes,px2);
       
        for (y=0;y<bm2.bmHeight;y++)//针对整张图片进行处理
        {
                for (x=0;x<bm2.bmWidth;x++)
                {
                        rgb_b = y*bm2.bmWidthBytes+x*pxByte;
                        int i = (y+ystart)*bm1.bmWidthBytes+(x+xstart)*pxByte;
                       
                        px2[rgb_b] = unsigned char(px2[rgb_b]*0.3+px1);
                        px2[rgb_b+1] = unsigned char(px2[rgb_b+1]*0.3+px1[i+1]);
                        px2[rgb_b+2] = unsigned char(px2[rgb_b+2]*0.3+px1[i+2]);
                }
        }

        SetBitmapBits(fog,bm2.bmHeight*bm2.bmWidthBytes,px2);

        //拷贝背景
        SelectObject(mdc,bitmap);
        BitBlt(hdc,rect.left,rect.top,rect.right,rect.bottom,mdc,rect.left,rect.top,SRCCOPY);

        //拷贝前景
        SelectObject(mdc,fog);
        BitBlt(hdc,xstart,ystart,Num*200,130,mdc,0,0,SRCCOPY);

        ReleaseDC(hwd,hdc);
        DeleteDC(mdc);
        DeleteDC(buf);
        DeleteObject(bitmap);
        DeleteObject(fog);
        delete [] px1;
        delete [] px2;
}
当云朵是3的时候 显示正常 ,但是当云朵是4的时候会有问题!怎么无法上传截图呢?!

3

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2010-5-23 08:51:00 | 显示全部楼层

Re:关于半透明的问题!

自己顶一个 问题暂时没有得到解决 。。

28

主题

433

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2010-5-26 14:29:00 | 显示全部楼层

Re:关于半透明的问题!

这个你 自己看吧~~
alpha混合用下面这个 函数~~
BOOL AlphaBlend(
HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,
HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
BLENDFUNCTION blendFunction);

绘图用TransparentBlt()

//=========================================================
我只想说 你看的书 太旧了~~

3

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2010-5-26 18:31:00 | 显示全部楼层

Re:关于半透明的问题!

谢谢 已经使用了这个函数!效果很好是透明了 但是还是会出现小框框!

28

主题

433

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2010-5-29 22:26:00 | 显示全部楼层

Re:关于半透明的问题!

你没有双缓冲 当然 有 闪烁了~~~
你找本 好书 看呀~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 14:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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