我的程序要多次创建draw对象用来显示多幅图象,第一幅图象显示完全正确,但之后的图象就显示不出来了 我查了一下原因是从显示表面加琐出错不能的到显示表面的lPitch,请问会有什么原因呢 我的显示表面创建都成功了
部分代码如下
bool sysdirect_draw::create(HWND owner, int width, int height,bool mode)
{
HRESULT hr = 0;

GetWindowRect(owner, &rc) ; bFourCCSupport = 0 ;
o = owner ;

w = width ;
hi = height ;

hr = DirectDrawCreate(NULL, &h, NULL) ;
if (hr != DD_OK)  
{
destroy() ; return false ;
}
hr = h->SetCooperativeLevel(owner, DDSCL_NORMAL) ;//设置协作级别
if (hr != DD_OK)  
{
destroy() ; return false ;
}

if (!create_pm_surface())   //创建主显示平面
{
destroy() ; return false ;
}
if (!create_clipper(owner))  //创建剪切平面
{
destroy() ; return false ;
}
hr = pm->SetClipper(cl) ;      
if (hr != DD_OK)  
{
destroy() ; return false ;
}
if (!create_bk_surface(width, height))   //创建从显示平面
{
bk->Release() ; bk = NULL ;
bFourCCSupport = FALSE ;
if (!create_bk_surface(width, height))  
{
destroy() ; ::MessageBox(NULL, "display memory error!", "ERROR", MB_OK) ;
return false ;
}
}
update_bound(mode);
pSnapBuf = NULL ;

return true ;
}
//创建主背景平面
bool sysdirect_draw::create_pm_surface()
{
HRESULT hr = 0; dd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;

hr = h->CreateSurface(&dd, &pm, NULL) ;
if (hr != DD_OK)  
{
destroy() ; return false ;
}
//
pm->GetSurfaceDesc(&dd) ;
bc = dd.ddpfPixelFormat.dwRGBBitCount ;
if (bc == 16 && dd.ddpfPixelFormat.dwRBitMask != 0x0000F800)
bc = 15 ;
bFourCCSupport = CheckFourCC() ;
return true ;
}
//创建从背景平面
bool sysdirect_draw::create_bk_surface(int width, int height)
{
HRESULT  hr = 0;
dd.dwFlags = (DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT) ;
dd.dwWidth = width ;
dd.dwHeight = height ;
if (bFourCCSupport)  
{
dd.dwFlags |= DDSD_PIXELFORMAT ;
dd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT) ;
dd.ddpfPixelFormat.dwFlags = DDPF_FOURCC ;
dd.ddpfPixelFormat.dwFourCC = fccYUY2 ;
dd.ddpfPixelFormat.dwYUVBitCount = 16 ;
}
else  
{
switch (bc)  
{
case 15 :
dd.ddpfPixelFormat.dwBBitMask = 0x0000001F;
dd.ddpfPixelFormat.dwGBitMask = 0x000003E0;
dd.ddpfPixelFormat.dwRBitMask = 0x00007C00;
break ;
case 16 :
dd.ddpfPixelFormat.dwBBitMask = 0x0000001F;
dd.ddpfPixelFormat.dwGBitMask = 0x000007E0;
dd.ddpfPixelFormat.dwRBitMask = 0x0000F800;
break ;
case 24 :
dd.ddpfPixelFormat.dwRBitMask = 0x000000FF;
dd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
dd.ddpfPixelFormat.dwBBitMask = 0x00FF0000;
break;
case 32 :
dd.ddpfPixelFormat.dwRBitMask = 0x000000FF;
dd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
dd.ddpfPixelFormat.dwBBitMask = 0x00FF0000;
break;
default :
dd.ddpfPixelFormat.dwRBitMask = 0x000000FF;
dd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
dd.ddpfPixelFormat.dwBBitMask = 0x00FF0000;
break ;
}
}
dd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY ;
//surface
hr = h->CreateSurface(&dd, &(bk), NULL) ;
if (hr != DD_OK)  
{
dd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY ;
hr = h->CreateSurface(&dd, &(bk), NULL) ;
if (hr != DD_OK)  
{
return false ;
}
}
return true ;
}DWORD sysdirect_draw::GetSurfaceStride()
{
DWORD    stride ;
if (bk->Lock(NULL, &dd, 0, NULL) == DD_OK)  
{
stride = (DWORD)(dd.lPitch) ;
bk->Unlock(NULL);
}
else
stride = 0 ;
return stride ;
}其中 (bk->Lock(NULL, &dd, 0, NULL) == DD_OK) 加锁失败 什么原因啊