视图显示大图片??

LiSCode 2007-06-08 09:54:07
问题是这样的:

我先创建了一个单文档应用程序,这个程序的作用是处理图像,

首先要把图像载入视图,但是如果图片尺寸太大而视图显示不开的话,

那么就要用到滚动条了,但是,用了滚动条问题就来了,

就是在按下滚动条的箭头时,一直按不松开,我发现内存使用率迅速上升!!直到达到100%

注意是内存使用率上升,而不是CPU使用率,CPU使用率变化不大,

如果中途松开,那么内存使用率将停止增长,但是也不会下降,

但是退出程序后,内存使用率将下降到正常位置,

我现在大概知道是什么原因造成的,肯定是按住滚动条的箭头时不停的调用OnDraw()函数,

而OnDraw()函数中不停的生成一些变量,而且是非常大的变量,生成后没有释放,所以造成这个结果,

我也知道应该释放这些内存,可是我不知道的是应该怎么释放?????

OnDraw()函数中添加代码如下:
void CMyScrollView::OnDraw(CDC* pDC)
{
CScrollDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//*********************************************************************
//以下是添加的内容:
if(GetDocument()->GetPathName()!="") //判断用户是否打开了磁盘上的文件
{
HBITMAP bitmap;
bitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
GetDocument()->GetPathName(),
IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CRect rect;

GetClientRect(&rect);
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY); //绘制位图
}
//**********************************************************************************
}


void CMyScrollView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 10000;
SetScrollSizes(MM_TEXT, sizeTotal);
//**********************************************
//以下是添加的内容:
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

//**********************************************
}

高手们赐教呀!!!
...全文
335 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiSCode 2007-06-16
  • 打赏
  • 举报
回复
答案我已经找到了,应该是

DeleteObject(bitmap);

在OnDraw函数中的if语句的最后添加上这一句就行了

你们说的我都试了,都不对,很遗憾,不能给大家分了......
mclean029 2007-06-13
  • 打赏
  • 举报
回复
你干吗要自己添加滚动条
  • 打赏
  • 举报
回复
惭愧:
应该是Bitmap DeleteObject
  • 打赏
  • 举报
回复
刀刀不要乱说,程序本身没有问题,也没有内存泄漏的问题。
加上MemDC.SelectObject(OldBitmap) ;不知道行不行?

原因可能是OnDraw函数结束后,局部变量释放的速度太慢。
splover 2007-06-12
  • 打赏
  • 举报
回复
哎 还忘了说最后用一下free(bitmap)
splover 2007-06-12
  • 打赏
  • 举报
回复
还有就是最好不要一下把整个图象都读近来,
最好读个显示的范围。
splover 2007-06-12
  • 打赏
  • 举报
回复
最好LOADIMAGE在别的地方读取,
而且ondraw最后加上
bitmap.deleteobject();
memdc.deletedc();
  • 打赏
  • 举报
回复
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);

MemDC.SelectObject(OldBitmap) ;

不知道有没有用?
buggycode 2007-06-09
  • 打赏
  • 举报
回复
When you are finished using a bitmap, cursor, or icon you loaded without specifying the LR_SHARED flag, you can release its associated memory by calling one of the functions in the following table.

Bitmap DeleteObject
Cursor DestroyCursor
Icon DestroyIcon

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧