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

arden1019 2007-04-18 09: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中显示在重画窗口后,有时会出现泄露,但并不是每次都会发生.
请各位大大给写建议,重画窗口的时候,应该怎么样做比较好.


...全文
333 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2007-04-19
  • 打赏
  • 举报
回复
//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
  • 打赏
  • 举报
回复
楼上星星全说了!
偶就顶下吧!^_^
arden1019 2007-04-19
  • 打赏
  • 举报
回复
多谢...
菜牛 2007-04-19
  • 打赏
  • 举报
回复
响应WM_ERASEBKGND消息,不过你觉得的没道理,只要窗口刷新了,必须绘制背景。
arden1019 2007-04-19
  • 打赏
  • 举报
回复
OnEraseBkgnd() 这个消息处理在什么地方?我没有找到呵呵。

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

有没有什么比较好的方法呢?
zhcxrs 2007-04-18
  • 打赏
  • 举报
回复
ATField() 说得好
「已注销」 2007-04-18
  • 打赏
  • 举报
回复
楼上说得在理
ATField 2007-04-18
  • 打赏
  • 举报
回复
mDC没有delete,deleteDC只是释放句柄,并没有释放mDC变量本身占用的内存。
最好不要用new来分配mDC和RC,直接声明并在栈上创建即可,如CRect RC;这样速度快,又不会造成内存泄漏,也不会造成内存碎片等问题
yulefox 2007-04-18
  • 打赏
  • 举报
回复
CPaintDC 应该是成对使用 BeginPaint and EndPaint(不用new and delete)

CDC 应该是成对使用 GetDC and ReleaseDC(不用new and delete)

另外,SelectObject最好选回原来的CBitmap
DentistryDoctor 2007-04-18
  • 打赏
  • 举报
回复
mDC?

19,468

社区成员

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

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