游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: block

编DIRECTX截图,到LOCK时出错,请帮忙~

[复制链接]

5

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2004-4-8 23:53:00 | 显示全部楼层

Re:编DIRECTX截图,到LOCK时出错,请帮忙~

你好啊,感谢你的回复。按照你的要求对程序进行了简单修改,增加了CXxxDlg类定义;全都改为7版了。感觉程序有了进步。

文件开始修改定义为:
LPDIRECTDRAW7 lpdd = NULL;
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
DDSURFACEDESC2 ddsd;

按下BUTTON:
void CXxxDlg::OnButton1()
{
DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);
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)
{
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
if (SaveToBitmapFile(lpddsprimary,"d:\\t.bmp")) MessageBeep(MB_OK);
KillTimer(1);
MessageBeep(MB_OK);       
CDialog::OnTimer(nIDEvent);
}

bool SaveToBitmapFile(LPDIRECTDRAWSURFACE7 lpSurface, char* filename)
{  WORD* lpBuffer; // 表面指针
int nPitch; // 表面跨距
int nWidth, nHeight; // 表面宽高
FILE* fp;
if( (fp=fopen(filename, "wb")) != NULL )
{
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT, NULL );
if( ddrval == DD_OK )
{
  

运行后虽然还是LOCK地方报错,但通过与其他正常的画随机点的范例程序(在LOCK打断点)对比参数数值,只有在lpSurface的Iunknow的VALUE报CXX0030:Error:expression cannot be evaluated.和ddrva的VALUE是-868593460。其他参数例如DDSD等VALUE都已基本类似,呵呵。
另外还感谢你的鼓励~我会继续努力的。

0

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2004-4-9 16:04:00 | 显示全部楼层

Re:编DIRECTX截图,到LOCK时出错,请帮忙~

"DirectDrawCreateEx" 在哪里定义的?

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-4-9 17:46:00 | 显示全部楼层

Re:编DIRECTX截图,到LOCK时出错,请帮忙~

看你第一次贴的代码里,只是定义了lpSurface,但并没有对它赋值,也没有设定初值,你确定它是一个有效的指针吗?

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2004-4-9 19:23:00 | 显示全部楼层

Re:编DIRECTX截图,到LOCK时出错,请帮忙~

void CXxxDlg::OnTimer(UINT nIDEvent)
{
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;  //你怎么有把这个加上了,
本身,你是要保存的,突然把它指向一个不明确的地址,你说,不出错才怪!!!
if (SaveToBitmapFile(lpddsprimary,"d:\\t.bmp")) MessageBeep(MB_OK);
KillTimer(1);
MessageBeep(MB_OK);
CDialog::OnTimer(nIDEvent);
}

5

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2004-4-9 21:04:00 | 显示全部楼层

Re:编DIRECTX截图,到LOCK时出错,请帮忙~

唉不好意思一是疏忽!实际程序中是没有那一行的!
主要是为了在论坛中节省地方好看些,不小心把//LPDIRECTDRAWSURFACE7 lpddsprimary = NULL; 前的“//”注释也去掉了  !实际程序中是注释掉的 。实际上是:

void CXxxDlg::OnTimer(UINT nIDEvent)
{
//LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;  
if (SaveToBitmapFile(lpddsprimary,"d:\\t.bmp")) MessageBeep(MB_OK);
KillTimer(1);
MessageBeep(MB_OK);
CDialog::OnTimer(nIDEvent);
}

5

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2004-4-9 21:14:00 | 显示全部楼层

Re: Re:编DIRECTX截图,到LOCK时出错,请帮忙~

shl716: Re:编DIRECTX截图,到LOCK时出错,请帮忙~

"DirectDrawCreateEx" 在哪里定义的?


shl716你好短信息已收到。我参考的书籍是《WINDOWS游戏编程大师技巧(第二版本)》中国电力出版社,和《PC游戏编程(DIRECTX8)》(类似前者的简化版)。后者光盘带的源程序经过编译可以运行的;前者的光盘我就用得比较少。

5

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2004-4-14 07:44:00 | 显示全部楼层

Re:编DIRECTX截图,到LOCK时出错,请帮忙~

希望高手都能来帮帮我,55~~沉得好快啊 ~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-30 03:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表