HRESULT ddrval;
ddrval = lpBackBuffer->BltFast( 0, 0, lpDDSOne,&rc,DDBLTFAST_WAIT);//背景位图传送到后台缓冲区
if( ddrval != DD_OK )
{
Msg("Blt failed! err=135971476",ddrval);
return;
}
DDSURFACEDESC ddsd,ddsd2;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ZeroMemory(&ddsd2,sizeof(ddsd2));
ddsd2.dwSize=sizeof(ddsd2);
ddrval=lpBackBuffer->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);//锁定台缓冲区
if(ddrval!=DD_OK)
{
Msg("lock failed");//锁定台缓冲区失败,退出程序
PostMessage(WM_CLOSE);
return;
}
ddrval=lpDDSTwo->Lock(NULL,&ddsd2,DDLOCK_WAIT,NULL);//锁定包含前景位图的表面
if(ddrval!=DD_OK)
{
Msg("lock failed");
PostMessage(WM_CLOSE);
return;
}
BYTE* Bitmap=(BYTE*)ddsd.lpSurface;//获取背景位图在内存中的起点位置
BYTE* Bitmap2=(BYTE*)ddsd2.lpSurface;//获取前景位图在内存中的起点位置
int alpha;
int pos,pos1;
static double rate1=0.05,rate2=0.0;
if(rate1>1.0)rate1=0.0;
rate2=1.0-rate1;
for(int y=newRect1.top;y<=newRect1.bottom;y++)
{//newRect1为CRect对象,存放前景位图在屏幕中的显示位置
pos=newRect1.left*4+y*ddsd.lPitch;
pos1=(y-newRect1.top)*ddsd2.lPitch;
for(int x=newRect1.left;x<=newRect1.right;x++)
{
//RED
alpha=(int)Bitmap2[pos1]*rate1;
Bitmap[pos]=(int)Bitmap[pos]*rate2+alpha;
if((int)Bitmap[pos]>255)Bitmap[pos]=255;
pos++;pos1++;
//GREEN
alpha=(int)Bitmap2[pos1]*rate1;
Bitmap[pos]=(int)Bitmap[pos]*rate2+alpha;
if((int)Bitmap[pos]>255)Bitmap[pos]=255;
pos++;pos1++;
//BLUE
alpha=(int)Bitmap2[pos1]*rate1;
Bitmap[pos]=(int)Bitmap[pos]*rate2+alpha;
if((int)Bitmap[pos]>255)Bitmap[pos]=255;
pos++;pos1++;
//REVERSE
pos++;pos1++;
}
}
rate1+=0.05;
lpBackBuffer->Unlock(&ddsd);//解锁表面
lpDDSTwo->Unlock(&ddsd2);//解锁表面
CGameWnd::Flip();//翻转表面
ddrval = lpBackBuffer->BltFast( 0, 0, lpDDSOne,&rc,DDBLTFAST_WAIT);//背景位图传送到后台缓冲区
if( ddrval != DD_OK )
{
Msg("Blt failed! err=135971476",ddrval);
return;
}
DDSURFACEDESC ddsd,ddsd2;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ZeroMemory(&ddsd2,sizeof(ddsd2));
ddsd2.dwSize=sizeof(ddsd2);
ddrval=lpBackBuffer->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);//锁定台缓冲区
if(ddrval!=DD_OK)
{
Msg("lock failed");//锁定台缓冲区失败,退出程序
PostMessage(WM_CLOSE);
return;
}
ddrval=lpDDSTwo->Lock(NULL,&ddsd2,DDLOCK_WAIT,NULL);//锁定包含前景位图的表面
if(ddrval!=DD_OK)
{
Msg("lock failed");
PostMessage(WM_CLOSE);
return;
}
BYTE* Bitmap=(BYTE*)ddsd.lpSurface;//获取背景位图在内存中的起点位置
BYTE* Bitmap2=(BYTE*)ddsd2.lpSurface;//获取前景位图在内存中的起点位置
int alpha;
int pos,pos1;
static double rate1=0.05,rate2=0.0;
if(rate1>1.0)rate1=0.0;
rate2=1.0-rate1;
for(int y=newRect1.top;y<=newRect1.bottom;y++)
{//newRect1为CRect对象,存放前景位图在屏幕中的显示位置
pos=newRect1.left*4+y*ddsd.lPitch;
pos1=(y-newRect1.top)*ddsd2.lPitch;
for(int x=newRect1.left;x<=newRect1.right;x++)
{
//RED
alpha=(int)Bitmap2[pos1]*rate1;
Bitmap[pos]=(int)Bitmap[pos]*rate2+alpha;
if((int)Bitmap[pos]>255)Bitmap[pos]=255;
pos++;pos1++;
//GREEN
alpha=(int)Bitmap2[pos1]*rate1;
Bitmap[pos]=(int)Bitmap[pos]*rate2+alpha;
if((int)Bitmap[pos]>255)Bitmap[pos]=255;
pos++;pos1++;
//BLUE
alpha=(int)Bitmap2[pos1]*rate1;
Bitmap[pos]=(int)Bitmap[pos]*rate2+alpha;
if((int)Bitmap[pos]>255)Bitmap[pos]=255;
pos++;pos1++;
//REVERSE
pos++;pos1++;
}
}
rate1+=0.05;
lpBackBuffer->Unlock(&ddsd);//解锁表面
lpDDSTwo->Unlock(&ddsd2);//解锁表面
CGameWnd::Flip();//翻转表面