游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1408|回复: 2

大家帮我看一下这段代码。

[复制链接]

22

主题

30

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2004-12-22 16:12:00 | 显示全部楼层 |阅读模式
以下是我想写一个将指定的BMP位图加载到Surface中去的函数:

函数第一个参数lpSurface 是欲创建的LPDIRECTDRAWSURFACE7 对象。
第二个参数是指定某个BMP位图的路径,如 "C:\\aaa.bmp"

HRESULT CreateSurfaceFormBitmap(LPDIRECTDRAWSURFACE7 lpSurface,TCHAR *Path)
{
                HDC hdc_surf;
        HDC hdc_image;
        HBITMAP hbmp1;
        BITMAP bmp1;
        DDSURFACEDESC2 ddsd_t;

        hbmp1 = (HBITMAP)LoadImage(0,Path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_DEFAULTSIZE);
       
        hdc_image = CreateCompatibleDC(NULL);
           
        SelectObject(hdc_image,hbmp1);
        GetObject(hbmp1,sizeof(bmp1),&bmp1);
       
        ZeroMemory(&ddsd_t,sizeof(ddsd_t));
        ddsd_t.dwSize = sizeof(ddsd_t);
        ddsd_t.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
        ddsd_t.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
        ddsd_t.dwHeight = bmp1.bmHeight;
        ddsd_t.dwWidth = bmp1.bmWidth;
       
        rsl = lpdraw->CreateSurface(&ddsd_t,&lpSurface,NULL);
        if (FAILED(rsl))
                    MessageBox(hWnd,"error1","error1",0);

        rsl = lpSurface->GetDC(&hdc_surf);
                if (FAILED(rsl))
            MessageBox(hWnd,"error3","error3",0);

        StretchBlt(hdc_surf,0,0,bmp1.bmWidth,bmp1.bmHeight,hdc_image,0,0,bmp1.bmWidth,bmp1.bmHeight,SRCCOPY);
        lpSurface->ReleaseDC(hdc_surf);
        DeleteDC(hdc_image);
        DeleteObject(hbmp1);
        return DD_OK;
}
如果执行这段函数后,然后在调用 GetSurfaceDesc来获得刚才建立的Surface的描述结构,就回整个程序退出了,如果没有调用GetSurfaceDesc就没有事。主要是什么提示都没有的就退出了。不知道我这个函数里还有什么不足的。

还有想问一下,哪个版本的Directx SDK 安装的时候有Debug 模式的提示。我系统里装的是
Directx9.0c 发布版。也装了Directx7.0 SDK 和 Directx8.1b SDK 但我运行dxdiag程序的时候
查看"Directx 文件"标签里的属性都是“最终 零售"的属性。如果是调试版的话应该就会有些提示出来吧。多谢!

[em4]

1

主题

130

帖子

135

积分

注册会员

Rank: 2

积分
135
发表于 2004-12-22 16:26:00 | 显示全部楼层

Re:大家帮我看一下这段代码。

跟踪一下你的Surface是否为空....
把函数改成HRESULT CreateSurfaceFormBitmap(LPDIRECTDRAWSURFACE7* lppSurface,TCHAR *Path)
因为你的surface是内部创建的,外面没有事先分配空间,所以应该用2级指针.不过问题也有可能不是出在这里....反正跟踪一下hr的值就知道了

GetSurfaceDesc理论上就算失败也只是返回一个不为0的值,不会强行跳出,应该是你使用了它的返回值做了什么判断....就算是调试版也没什么提示信息,一般需要返回信息,使用
if(FAILED(hr) )
   return E_FAIL;

22

主题

30

帖子

32

积分

注册会员

Rank: 2

积分
32
 楼主| 发表于 2004-12-22 19:18:00 | 显示全部楼层

Re: 大家帮我看一下这段代码。

多谢。确实是你说的要用指针做参数的问题。不过我觉得挺奇怪,LPDIRECTDRAWSURFACE7 本身就是指针,为何就不能呢? [em13]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-18 10:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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