您的位置:程序门 -> vc/mfc -> 图形处理/算法



视图显示大图片??


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


视图显示大图片??
发表于:2007-06-08 21: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();

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

高手们赐教呀!!!
发表于:2007-06-09 08:16:271楼 得分:0
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  

发表于:2007-06-09 09:39:482楼 得分:0
oldbitmap=(hbitmap)memdc.selectobject(bitmap);
pdc-> bitblt(0,0,rect.width(),rect.height(),&memdc,0,0,srccopy);

memdc.selectobject(oldbitmap)   ;

不知道有没有用?
发表于:2007-06-12 10:16:243楼 得分:0
最好loadimage在别的地方读取,
而且ondraw最后加上
bitmap.deleteobject();
memdc.deletedc();
发表于:2007-06-12 10:23:054楼 得分:0
还有就是最好不要一下把整个图象都读近来,
最好读个显示的范围。
发表于:2007-06-12 10:27:265楼 得分:0
哎       还忘了说最后用一下free(bitmap)
发表于:2007-06-12 22:36:056楼 得分:0
刀刀不要乱说,程序本身没有问题,也没有内存泄漏的问题。
加上memdc.selectobject(oldbitmap)   ;不知道行不行?

原因可能是ondraw函数结束后,局部变量释放的速度太慢。
发表于:2007-06-13 15:53:297楼 得分:0
惭愧:
应该是bitmap   deleteobject
发表于:2007-06-13 15:58:518楼 得分:0
你干吗要自己添加滚动条
发表于:2007-06-16 17:17:269楼 得分:0
答案我已经找到了,应该是

deleteobject(bitmap);

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

你们说的我都试了,都不对,很遗憾,不能给大家分了......


快速检索

最新资讯
热门点击