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



窗口重画时内存占用不断增加


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


窗口重画时内存占用不断增加[已结贴,结贴人:arden1019]
发表于:2007-04-18 21:28:53 楼主
下面是我程序中onpaint的代码

cpaintdc   dc(this);
cbitmap     cb;
cdc   *mdc=new   cdc;
crect   *rc=new   crect;
cdc   *pcdc;

getclientrect(rc);
pcdc=getdc();
mdc-> createcompatibledc(pcdc);
cb.loadbitmap(idb_back);
mdc-> selectobject(cb);
dc.bitblt(0,0,rc-> width(),rc-> height(),mdc,0,0,srccopy);

                  cb.deleteobject();
releasedc(pcdc);
deletedc(mdc-> m_hdc);
delete   rc;

cdialog::onpaint();
我想我已经释放了这些资源,用memproof跟了一下,这些dc资源并没有泄露,但是heap中显示在重画窗口后,有时会出现泄露,但并不是每次都会发生.
请各位大大给写建议,重画窗口的时候,应该怎么样做比较好.


发表于:2007-04-18 21:34:221楼 得分:1
mdc?
发表于:2007-04-18 21:40:112楼 得分:10
cpaintdc   应该是成对使用   beginpaint   and   endpaint(不用new   and   delete)

cdc   应该是成对使用   getdc   and   releasedc(不用new   and   delete)

另外,selectobject最好选回原来的cbitmap
发表于:2007-04-18 21:51:413楼 得分:10
mdc没有delete,deletedc只是释放句柄,并没有释放mdc变量本身占用的内存。
最好不要用new来分配mdc和rc,直接声明并在栈上创建即可,如crect   rc;这样速度快,又不会造成内存泄漏,也不会造成内存碎片等问题
发表于:2007-04-18 23:18:284楼 得分:1
楼上说得在理
发表于:2007-04-18 23:56:335楼 得分:1
atfield()   说得好
发表于:2007-04-19 00:23:396楼 得分:50
//cdialog::onpaint();如果要调用,放到前面,一般不要调用

cpaintdc   dc(this);
cbitmap     cb;
cdc   mdc;
crect   rc;
getclientrect(rc);
mdc.createcompatibledc(&dc);
cb.loadbitmap(idb_back);
cbitmap   *bmpold   =   mdc-> selectobject(&cb);
dc.bitblt(0,0,rc-> width(),rc-> height(),&mdc,0,0,srccopy);
//这里有个问题,如果客户区大于图片大小,就会出错,一般应该根据位图的大小来贴图,或者改用stretchblt来拉伸位图。
mdc.selectobject(bmpold);
                  cb.deleteobject();
mdc.deletedc();

貌似给对话框贴背景的,放到onerasebkgnd()里面更好。
发表于:2007-04-19 08:16:207楼 得分:1
楼上星星全说了!
偶就顶下吧!^_^
发表于:2007-04-19 14:36:398楼 得分:0
onerasebkgnd()   这个消息处理在什么地方?我没有找到呵呵。

我总觉的~   把这些东西放在onpaint里面不太好,即使都把资源回收了~也需要占用不少cpu吧。因为只要窗口每次需要重绘都进去来一遍。

有没有什么比较好的方法呢?
发表于:2007-04-19 16:34:279楼 得分:26
响应wm_erasebkgnd消息,不过你觉得的没道理,只要窗口刷新了,必须绘制背景。
发表于:2007-04-19 17:04:3910楼 得分:0
多谢...


快速检索

最新资讯
热门点击