DirectDraw的Surface是32位的,我要显示24位,16位,8位BMP图,怎么办?

jmcooler 2007-03-06 06:01:46
DirectDraw的Surface是32位的,我要显示24位,16位,8位BMP图,怎么办?怎么进行全屏播放?
我在创建主表面时,没有设置象素格式,而在创建离屏(OFFSCREENPLAIN)表面时设置了象素格式如下:
ZeroMemory( &ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = nVidWidth;
ddsd.dwHeight = nVidHeight;
ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
ddsd.ddpfPixelFormat.dwRGBBitCount = 24;
switch( nClrDepth )
{
case 8:
ddsd.ddpfPixelFormat.dwRBitMask = 0xFF0000;
break;
case 15: //RGB555
ddsd.ddpfPixelFormat.dwRBitMask = 0x7c00;
ddsd.ddpfPixelFormat.dwGBitMask = 0x3e0;
ddsd.ddpfPixelFormat.dwBBitMask = 0x1f;
break;
case 16: //RGB565
ddsd.ddpfPixelFormat.dwRBitMask = 0xf800;
ddsd.ddpfPixelFormat.dwGBitMask = 0x7e0;
ddsd.ddpfPixelFormat.dwBBitMask = 0x1f;
break;
case 24:
ddsd.ddpfPixelFormat.dwRBitMask = 0xff0000;
ddsd.ddpfPixelFormat.dwGBitMask = 0xff00;
ddsd.ddpfPixelFormat.dwBBitMask = 0xff;
break;
case 32:
ddsd.ddpfPixelFormat.dwRBitMask = 0xff0000;
ddsd.ddpfPixelFormat.dwGBitMask = 0xff00;
ddsd.ddpfPixelFormat.dwBBitMask = 0xff;
break;
default:
return FALSE;
}
ddrval = m_lpDDraw->CreateSurface( &ddsd, &m_lpddsBack, NULL );
它经常返回一个错误(象素格式不正确)
...全文
525 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiancaiak 2007-03-12
  • 打赏
  • 举报
回复
用Win32函数 LoadImage() 可以加载任何的bmp

BOOL LoadBMPSurface(LPDIRECTDRAWSURFACE7 &lpDDS,LPCSTR pszBitmapFile)
{
HBITMAP hbm;
BITMAP bm;
HDC hdc1,hdc2;
HRESULT hr;
if(lpDDS==NULL)
{
MessageBox(m_hWnd,"未创建的DirectDrawNULL离屏表面","出错啦",0);
return FALSE;
}
hbm=(HBITMAP)LoadImage(NULL,pszBitmapFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hbm==NULL)
{
MessageBox(m_hWnd,"无法加载Bitmap文件","出错啦",0);
return FALSE;
}
hdc1=CreateCompatibleDC(NULL);
if(hdc1==NULL)
{
MessageBox(m_hWnd,"无法创建兼容DC","出错啦",0);
return FALSE;
}
SelectObject(hdc1,hbm);
GetObject(hbm,sizeof(bm),&bm);
DDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
hr=lpDDS->GetSurfaceDesc(&ddsd);
if(hr!=DD_OK)
{
MessageBox(m_hWnd,"无法得到表面信息","出错啦",0);
return FALSE;
}
hr=lpDDS->GetDC(&hdc2);
if(hr!=DD_OK)
{
MessageBox(m_hWnd,"无法创建表面相关DC","出错啦",0);
return FALSE;
}
StretchBlt(hdc2,0,0,ddsd.dwWidth,ddsd.dwHeight,hdc1,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
lpDDS->ReleaseDC(hdc2);
DeleteObject(hbm);
DeleteDC(hdc1);
return TRUE;
}
jmcooler 2007-03-06
  • 打赏
  • 举报
回复
哦,忘记说,nClrDepth 就是24

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧