|
已经实现了半透明效果
#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的时候会有问题!怎么无法上传截图呢?!
|
|