1. CreateSurface创建的主表面是整个屏幕,所以设置协作级(SetCooperativeLevel)为窗口模式(DDSCL_NORMAL)时,
贴图需要设置裁剪器(LPDIRECDRAWCLIPPER),但SetDisplayMode有些什么后会失败,如有清楚原因的朋友麻烦告诉我,
不胜感激.
HRESULT hRet;
//初始化IDirectDraw7接口
hRet = DirectDrawCreateEx(NULL,(VOID**)&m_pDDraw,IID_IDirectDraw7,NULL);
if ( hRet != DD_OK )
{
AfxMessageBox(_T("创建DirectDraw接口失败"));
return FALSE;
}
//设置协作等级,为窗口模式
hRet = m_pDDraw->SetCooperativeLevel(this->GetSafeHwnd(),DDSCL_NORMAL);
if ( hRet != DD_OK )
{
AfxMessageBox(_T("设置窗口模式失败"));
return FALSE;
}
CRect rt;
GetClientRect(&rt);
//设置显示模式
hRet = m_pDDraw->SetDisplayMode(rt.Width(),rt.Height(),32,0,0);
if ( hRet != DD_OK )
{
AfxMessageBox(_T("设置窗口显示模式失败"));
return FALSE;
}
//创建表面结构体
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS ;//表面有DirectDraw表面功能,ddsCaps成员有效
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(FAILED(hRet = m_pDDraw->CreateSurface(&ddsd,&m_pddsPrimary,NULL)))
{
AfxMessageBox(_T("创建主表面失败"));
return FALSE;
}
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = 480;
ddsd.dwHeight = 320;
if (FAILED(m_pDDraw->CreateSurface(&ddsd,&m_pddsOffscreen,NULL)))
{
AfxMessageBox(_T("创建离屏表面失败"));
return FALSE;
}
//创建裁剪器
if(FAILED(m_pDDraw->CreateClipper(0,&m_lpPalette,NULL)))
{
AfxMessageBox(_T("创建裁剪器失败"));
return FALSE;
}
if(FAILED(m_lpPalette->SetHWnd(0,this->m_hWnd)))
{
AfxMessageBox(_T("创建裁剪器失败"));
return FALSE;
}
if (FAILED(m_pddsPrimary->SetClipper(m_lpPalette)))
{
AfxMessageBox(_T("创建裁剪器失败"));
return FALSE;
}