关于MFC CBitmap

我有一个单文档程序,启动时序列化,在序列化的同时,每读进180个数据。我就创建一张位图。并把数据画在这个位图上,并保存该位图句柄到一个vector里。问题:1.当数据量较... 我有一个单文档程序,启动时序列化,在序列化的同时,每读进180个数据。我就创建一张位图。并把数据画在这个位图上,并保存该位图句柄到一个vector里。
问题:1. 当数据量较大时,创建的位图也就增加,超过一定量的位图,CreateCompatibleBitmap这个函数就会返回FALSE,这个时候,我用
GetLastError()的返回值为8(8表示-存储空间不足,无法处理此命令。)
2. 由问题1,逐一检查,因为我创建位图是CBitmap *bitmap = new Cbitmap;有人说是没有释放的原因,我在创建,画图完成之后,进行释放。bitmap->DeleteObject();这次创建再多的位图都不会有问题了,但是,我本来是为了保存位图,现在又释放了,那岂不是我保存在vector里的CBitmap指针根本就失去了意义。

纠结吖。求大神指点
序列化时画图的代码如下
CDC * pMemDC = new CDC;
CBitmap *bitmap = new CBitmap;
pMemDC->CreateCompatibleDC(pDC);
bitmap->CreateCompatibleBitmap(pDC,maxright,maxhight);
CBitmap *pOldBmp = pMemDC->SelectObject(bitmap);
pMemDC->FillSolidRect(0,0,maxright,maxhight,RGB(0,0,0));
...//绘图
vecBmp.push_back(bitmap);//将位图指针存入vector<CBitmap *>
bitmap = NULL;
pMemDC->SelectObject(pOldBmp);
pMemDC->DeleteDC();
pMemDC = NULL;
pOldBmp = NULL;
显示的代码如下
CDC * pMemDC = new CDC;
CRect rect;
GetClientRect(rect);
pMemDC->CreateCompatibleDC(pDC);
pMemDC->FillSolidRect(0,0,rect.right,rect.Height(),RGB(0,0,0));
CBitmap * pOldBitmap = pMemDC->SelectObject(vecBmp[0]);//默认选入vecBmp[0]
pDC->BitBlt(0,0,rect.right,rect.Height(),pMemDC,0,0,SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
pMemDC->DeleteDC();
pOldBitmap = NULL;
pMemDC = NULL;
展开
 我来答
intehel
2012-09-25 · TA获得超过1293个赞
知道大有可为答主
回答量:1601
采纳率:100%
帮助的人:1770万
展开全部
一共有多少个数据?如果数据量巨大的话,尽量将位图加大,一张位图上多画些数据。通过偏移值来区分不同部分的数据。
例如(0,0)-(180,10)画前180个数据,接下来的(180,10)-(180,20)画第二部分180个数据。

...CBitmap跟HBITMAP其实是一个东东,所以用CBitmap出现的问题用HBITMAP一样会出现:每个进程的GDI句柄数是由限制的,具体请看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows下面的键值:GDIProcessHandleQuota,一般值为0x2710
相思丶猫2C
2012-09-24 · TA获得超过1198个赞
知道小有建树答主
回答量:1432
采纳率:50%
帮助的人:955万
展开全部
试试句柄:
CDC MemDC;
HBITMAP cache;
pMemDC->CreateCompatibleDC(pDC); //
bitmap->CreateCompatibleBitmap(pDC,maxright,maxhight); //
CBitmap *pOldBmp = pMemDC->SelectObject(bitmap); //
pMemDC->FillSolidRect(0,0,maxright,maxhight,RGB(0,0,0)); //
...//绘图
//vecBmp.push_back(bitmap);//将位图指针存入vector<CBitmap *>
vecBmp.push_back(cache);

pMemDC->SelectObject(pOldBmp);//
pMemDC->DeleteDC();//
pMemDC = NULL;//
pOldBmp = NULL;//
自己修改下。
追问
还是有问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9de5b9a
2012-09-25 · TA获得超过894个赞
知道小有建树答主
回答量:361
采纳率:0%
帮助的人:458万
展开全部
不要用位图指针,用位图对象试试,
你的向量里面有对象的引用,所以对象一直是有效的,不会退出函数就无效的。
对于DC也用对象就好了。
CDC pMemDC ;
pMemDC .DeleteDC();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jeese
2012-09-24 · 超过11用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:23.6万
展开全部
还是把你的代码附上吧,不然很难理解你的描述。
追问
代码已帖
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yangjs1108
2012-09-26
知道答主
回答量:55
采纳率:0%
帮助的人:14万
展开全部
这个问题没有碰到过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3038d88
2012-09-25 · TA获得超过1097个赞
知道小有建树答主
回答量:1670
采纳率:0%
帮助的人:1167万
展开全部
你快结贴吧?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式