|
|

楼主 |
发表于 2008-8-11 19:25:00
|
显示全部楼层
Re: !求助 关于directdraw的问题
以下是我的directdraw初始化
/**************************************************
* 函数名: InitDDraw(...)
* 功能: 初始化DDraw,并且创建主表面和翻转缓冲表面
* 版权所有 mochsh, 2003
***************************************************/
BOOL CDDraw::InitDDraw(HWND hWd,
BOOL bFScr,
DWORD ScrW,DWORD ScrH,
DWORD BitCount )
{
//--------------------------按给出的条件初始化变量
hWnd=hWd;
bFullScr=bFScr;
if(bFScr){//全屏模式
if(ScrW <= 640) { ScreenW = 640; ScreenH = 480; }
else if(ScrW <= 800){ ScreenW = 800; ScreenH = 600; }
else if(ScrW > 800) { ScreenW = 1024; ScreenH = 768; }
else {ScreenW=800; ScreenH = 600;}
if(BitCount<=8) ScreenC = 8;
else if(BitCount<=16)ScreenC = 16;
else if(BitCount<=24)ScreenC = 24;
else if(BitCount<=32)ScreenC = 32;
else ScreenC=16;
//检查模式是否有效
CheckDisplayMode();
}
else{//窗口模式
ScreenW=ScrW;
ScreenH=ScrH;
}
//--------------------------初始化DirectDraw环境
HRESULT ddrval;
//创建DirectDraw对象
ddrval = DirectDrawCreateEx(NULL,(void **) &lpDD,IID_IDirectDraw7,NULL);
if( FAILED(ddrval) ) {
//创建DirectDraw对象出错时进到这里来
//在这里可以记录创建DirectDraw对象的出错信息
return FALSE;
}
//******全屏模式***********//
if( bFullScr ){
//设置协作等级
ddrval = lpDD->SetCooperativeLevel( hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT );
if( FAILED( ddrval )){
//设置协作等级出错时进到这里来
//在这里可以记录设置协作等级的出错信息
return FALSE;
}
//设置显示模式
ddrval = lpDD->SetDisplayMode( ScreenW,ScreenH,ScreenC,NULL,NULL);
if( FAILED( ddrval ) ){
//设置显示模式出错时进到这里来
//在这里可以记录设置显示模式的出错信息
return FALSE;
}
//创建主表面
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if (ddrval!=DD_OK) {
//创建主表面出错时进到这里来
//在这里可以记录创建主表面的出错信息
return FALSE;
}
//创建后台缓冲表面
DDSCAPS2 ddscaps;
ZeroMemory(&ddscaps,sizeof(ddscaps));
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
ddrval=lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);
if (ddrval!=DD_OK) {
//获取后台缓冲表面出错时进到这里来
//在这里可以记录后台缓冲表面的出错信息
return FALSE;
}
return TRUE;
}
//******窗口模式***********//
else{
//设置协作等级
ddrval=(HRESULT)lpDD->SetCooperativeLevel( hWnd, DDSCL_NORMAL );
//创建主表面
DDSURFACEDESC2 ddsd;
ZeroMemory( &ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
//创建主表面,并取得指向主表面的指针lpDDSPrimary
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( FAILED( ddrval )){
//创建主表面出错时进到这里来
//在这里可以记录创建主表面的出错信息
return FALSE;
}
//使用裁剪器
UseClipper();
//创建后台缓冲表面
//:::::::ddsd前面已经声明
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth = ScreenW;//宽的分辨率
ddsd.dwHeight = ScreenH;//高的分辨率
//创建一后台缓冲表面
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSBack, NULL );
if( FAILED( ddrval )){
//创建后台缓冲表面出错时进到这里来
//在这里可以记录创建后台缓冲表面的出错信息
return FALSE;
}
}
return TRUE;
//--------------------------初始化DirectDraw环境完成
}
以下是我的页面翻转
/**************************************************
* 函数名: Flip(...)
* 功能: 翻转表面==>显示
* 版权所有 mochsh, 2003
***************************************************/
void CDDraw::Flip( LPRECT pRectWin )
{
HRESULT ddrval=1;
if( lpDDSPrimary && lpDDSBack )
{
//检查表面是否丢失
if (lpDDSPrimary->IsLost()==DDERR_SURFACELOST)
lpDDSPrimary->Restore();
if (lpDDSBack->IsLost()==DDERR_SURFACELOST)
lpDDSBack->Restore();
do{
if(bFullScr==1)
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );
else
ddrval = lpDDSPrimary->Blt( pRectWin,lpDDSBack,NULL,DDBLT_WAIT,NULL);
//翻转表面后的信息检测
if( ddrval == DD_OK )
break;
else if( ddrval == DDERR_SURFACELOST ){
if( FAILED(lpDDSBack->Restore()) )
break;
if( FAILED(lpDDSPrimary->Restore()) )
break;
}
else if( ddrval != DDERR_WASSTILLDRAWING )
break;
}while( 1 );
}
}
|
|