找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 782|回复: 4

[ARX函数]:acdbGetPreviewBitmapFromDwg 分配内存无法回收的问题?

[复制链接]
发表于 2006-1-16 20:28:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在定制控件OnPaint() 调用 acdbGetPreviewBitmapFromDwg () 函数,系统总是有内存无法回收,比如说定制一个ListBox控件,每项显示不同DWG文件,那么在滚动的时候会重复调用acdbGetPreviewBitmapFromDwg () 函数,即使调用了DeleteObject(hBitmap)和DeleteObject(hPaletter)也无济于事,系统会以增量消耗内存,不知道是否有办法解决这个问题吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-1-17 11:56:32 | 显示全部楼层
HBITMAP hBitmap;
HPALETTE hPal;
acdbGetPreviewBitmapFromDwg("foo.dwg", &hBitmap, &hPal);

// Palette
CPalette* oldPal = pDC->SelectPalette(CPalette::FromHandle(hPal),TRUE);
pDC->RealizePalette();

CBitmap bm;
bm.Attach(hBitmap);

CDC dcMem;
dcMem.CreateCompatibleDC(pDC);

CBitmap *pOldBitmap = dcMem.SelectObject(&bm);

pDC->BitBlt(0, 0, 1000,1000, &dcMem, 0, 0, SRCCOPY);

dcMem.SelectObject(pOldBitmap);

pDC->SelectPalette(oldPal,TRUE );
pDC->RealizePalette();

bm.DeleteObject();
DeleteObject(hBitmap);
DeleteObject(hPal);
这是帮助里的一段代码,供参考,你检查一下哪一项不对应。^_^
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-17 12:59:05 | 显示全部楼层
我也是这样的做的,代码和帮助中的没有出入,请看:
void OnPaint()
{
... ...
        HBITMAP hBitmap = NULL;
        HPALETTE hPalette = NULL;
        acdbGetPreviewBitmapFromDwg(item.szFilename, &hBitmap, &hPalette);

        if(hBitmap!=NULL && hPalette!=NULL)
        {
                CPalette* oldPal = pDC->SelectPalette(CPalette::FromHandle(hPalette), TRUE);
                pDC->RealizePalette();

                CBitmap bitmap;
                bitmap.Attach(hBitmap);

                BITMAP bm;
                bitmap.GetObject(sizeof(bm), (LPVOID)&bm);

                CDC dcMem;
                dcMem.CreateCompatibleDC(pDC);

                CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);
               
                CRect rectTemp = rectImage;
                double dx = (double)rectTemp.Width()/(double)(bm.bmWidth)+0.0000001;
                double dy = (double)rectTemp.Height()/(double)bm.bmHeight+0.0000001;
                double ds = 1.0;
                if(dx-dy < 0.0000001)
                {
                        ds = dx;
                        rectTemp.top = rectTemp.top + (rectTemp.Height()-(int)(bm.bmHeight*ds))/2;
                }
                else
                {
                        ds = dy;
                        rectTemp.left = rectTemp.left + (rectTemp.Width()-(int)(bm.bmWidth*ds))/2;
                }

                pDC->StretchBlt(rectTemp.left, rectTemp.top, (int)(bm.bmWidth*ds),(int)(bm.bmHeight*ds), &dcMem, 0, 0,bm.bmWidth, bm.bmHeight,SRCCOPY);
                dcMem.SelectObject(pOldBitmap);

                pDC->SelectPalette(oldPal,TRUE );
                pDC->RealizePalette();

                bitmap.DeleteObject();
                DeleteObject(hBitmap);
                DeleteObject(hPalette);
        }
... ...
}
问题是从函数acdbGetPreviewBitmapFromDwg返回的hBitmap, hPalette仅仅通过DeleteObject函数销毁的是什么?还有就是我怀疑acdbGetPreviewBitmapFromDwg函数内部在读取DWG文件的缩略图时有内存没有释放!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-17 13:42:37 | 显示全部楼层
acdbDisplayPreviewFromDwg
试试这个。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-17 16:50:15 | 显示全部楼层
:( 我的程序只能用acdbGetPreviewBitmapFromDwg, 其他函数不能满足程序要求!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 16:47 , Processed in 0.308628 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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