我的程序要多次创建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) 加锁失败 什么原因啊
部分代码如下
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) 加锁失败 什么原因啊
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货