关于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; 展开
问题: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; 展开
展开全部
一共有多少个数据?如果数据量巨大的话,尽量将位图加大,一张位图上多画些数据。通过偏移值来区分不同部分的数据。
例如(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
例如(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
展开全部
试试句柄:
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;//
自己修改下。
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;//
自己修改下。
追问
还是有问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不要用位图指针,用位图对象试试,
你的向量里面有对象的引用,所以对象一直是有效的,不会退出函数就无效的。
对于DC也用对象就好了。
CDC pMemDC ;
pMemDC .DeleteDC();
你的向量里面有对象的引用,所以对象一直是有效的,不会退出函数就无效的。
对于DC也用对象就好了。
CDC pMemDC ;
pMemDC .DeleteDC();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还是把你的代码附上吧,不然很难理解你的描述。
追问
代码已帖
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你快结贴吧?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询