|

楼主 |
发表于 2004-4-7 22:21:00
|
显示全部楼层
Re: Re:编DIRECTX截图,到LOCK时出错,请帮忙~
游戏人生: Re:编DIRECTX截图,到LOCK时出错,请帮忙~
第一,你用到了定时器!
第二,你用DIRECTX创建表面;
以上两者,存在着“顺序的关系”,在你还没有设...
十分感谢5楼的意见 ~~
我按照您的意见对程序进行了修改,但依然是老地方出错。
我用MFC创建一个对话框的程序,用一个BUTTON启动计时器和CREATESURFACE:
void CXxxDlg::OnButton1()
{
DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);
DDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if (FAILED(lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL))){}
SetTimer(1,4000,NULL);
}
触发后:
void CXxxDlg::OnTimer(UINT nIDEvent)
{
LPDIRECTDRAWSURFACE lpddsprimary = NULL;
if (SaveToBitmapFile(lpddsprimary,"d:\\t.bmp")) MessageBeep(MB_OK);
KillTimer(1);
MessageBeep(MB_OK);
CDialog::OnTimer(nIDEvent);
}
其中的 SaveToBitmapFile 照抄不变:
bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
{
WORD* lpBuffer; // 表面指针
int nPitch; // 表面跨距
int nWidth, nHeight; // 表面宽高
// 打开文件s
FILE* fp;
if( (fp=fopen(filename, "wb")) != NULL )
{
// 锁定表面
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof(ddsd);
HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
if( ddrval == DD_OK )
{
lpBuffer = (WORD *)ddsd.lpSurface;
nWidth = ddsd.dwWidth;
nHeight = ddsd.dwHeight;
nPitch = ddsd.lPitch >> 1; //lPitch以Byte为单位,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
}
运行该程序后,运行一DIRECTX程序,用ALT+TAB切换回来,按BUTTON,后ALT+TAB回游戏,等待4秒后SaveToBitmapFile(),但出错提示依然同我发的第一贴。该怎么办?
|
|