游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2555|回复: 8

各位高手看看我写的这段代码有什么错?

[复制链接]

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
发表于 2008-7-10 18:16:00 | 显示全部楼层 |阅读模式
我写的这个函数目的是将DirectDraw页面用指定颜色填充上,但是我写了一个循环,反复执行这个函数上千次后,DDto->GetDC()报错,程序停止执行,是不是代码不规范,留下了隐患?代码如下:

BOOL FillSurface(LPDIRECTDRAWSURFACE DDto,DWORD color,RECT rt)
{
        HDC hdc;
        HBRUSH hbr;
        hbr=::CreateSolidBrush(color);
        hdc=::CreateCompatibleDC(NULL);
        SelectObject(hdc,(HBRUSH)hbr);
        if(FAILED(DDto->GetDC(&hdc)))
        {
                MessageBox(NULL,"页面无法得到合法的设备DC!","错误",MB_ICONINFORMATION);
                return FALSE;
        }
        FillRect(hdc,&rt,hbr);
        DDto->ReleaseDC(hdc);
        :eleteObject((HBRUSH)hbr);
        ::DeleteDC(hdc);

        return TRUE;
}

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2008-7-10 19:56:00 | 显示全部楼层

Re:各位高手看看我写的这段代码有什么错?


  中间有系统内部内存泄漏,当然会死了。

    hdc=::CreateCompatibleDC(NULL);  <---你在这里建立了一个DC,
    SelectObject(hdc,(HBRUSH)hbr);
    if(FAILED(DDto->GetDC(&hdc)))    <----但是在这里把ddraw表面的HDC传给了hdc(没有保存原句柄),
                                          哪么你上一步建立的DC在哪里?已经丢失了!泄漏就在这里!

    DDto->ReleaseDC(hdc);            <----这句已经把ddraw的DC放掉了!!
    :eleteObject((HBRUSH)hbr);   <-----在没有把hbr从相关的DC脱离就delete,这是不安全的!!
    ::DeleteDC(hdc);                 <----这时hdc是一个无效的句柄了,你这行执行实际是无效的!!


    PS:按你的功能要求,并不需求建立临时的DC,如果你固执的要用DC去填颜色值,只需要把ddraw的DC用
brush填充就可以了,或者更直接的方式是用ddraw自带的填充功能,更有效率!!



56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
 楼主| 发表于 2008-7-11 08:44:00 | 显示全部楼层

Re:各位高手看看我写的这段代码有什么错?

我明白了一点了,但是如何“把hbr从相关的DC脱离”?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-7-13 09:57:00 | 显示全部楼层

Re:各位高手看看我写的这段代码有什么错?

I like to use the DC to fill a rect because :

1 I will not to convert the GDI COLOR(B8G8R8) to SURFACE's COLOR.
2 presently, PCs' performance is very high.

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2008-7-13 13:23:00 | 显示全部楼层

Re: Re:各位高手看看我写的这段代码有什么错?

xxnn: Re:各位高手看看我写的这段代码有什么错?

我明白了一点了,但是如何“把hbr从相关的DC脱离”?


HBRUSH hOldbr = SelectObject(hdc,(HBRUSH)hbr);  //保存原BRUSH

.....

SelectObject(hdc, hOldbr);    //把原brush回复回去,hbr就会与DC脱离!!
DeleteDC()...

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2008-7-13 13:28:00 | 显示全部楼层

Re: Re:各位高手看看我写的这段代码有什么错?

instemast: Re:各位高手看看我写的这段代码有什么错?

I like to use the DC to fill a rect because :

1 I will not to convert the GDI COLOR(B8G8R8) to SU...


GDI COLOR(B8G8R8) 和 SURFACE's COLOR 有什么差异你知道不?

PCs' performance is very high, PC的性能什么时候已经足够了?DC和直接surface的
fill rect操作差别在哪里你知道不?如果直接用DC就足够可以应付,MS为什么花费哪么多资源去开发DX?

PS:不要误人子弟!!!


56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
 楼主| 发表于 2008-7-14 09:18:00 | 显示全部楼层

Re: Re: Re:各位高手看看我写的这段代码有什么错?

kissorange: Re: Re:各位高手看看我写的这段代码有什么错?



HBRUSH hOldbr = SelectObject(hdc,(HBRUSH)hbr);  //保存原BRUSH

.....

SelectObject(hdc, hOld...

哈哈,原来是这样,我就懒省事不管啦,就让brush留在DC里吧!没有问题吧?

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
 楼主| 发表于 2008-7-14 09:24:00 | 显示全部楼层

Re: Re: Re:各位高手看看我写的这段代码有什么错?

kissorange: Re: Re:各位高手看看我写的这段代码有什么错?



HBRUSH hOldbr = SelectObject(hdc,(HBRUSH)hbr);  //保存原BRUSH

.....

SelectObject(hdc, hOld...

反正创建的DC最终我要删除,不必多此一举

1

主题

40

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2008-7-25 14:20:00 | 显示全部楼层

Re:各位高手看看我写的这段代码有什么错?

不是很明白
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 22:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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