关于在不同映射模式下要注意那些问题,如何避免GUI内存泄漏!

cwjcwjcwj 2004-05-02 10:06:14
我先举个例子吧,刚刚才知道的
比如我使用的是MM_HIMETRIC映射模式
void CGraphCtrl::DrawBK()
{
int nMode = m_pMemDC->SetMapMode(MM_TEXT);
m_pMemDC->FillRect(m_bkRect, &m_bkBrush);
m_pMemDC->SetMapMode(nMode);
}
如果在m_pMemDC->FillRect(m_bkRect, &m_bkBrush);语句前后不加上这两句的话,那么是没有办法清除背景的。
那么还有那些CDC函数的使用要注意这种区别呢?请大家一起来总结一下。

还有一个问题是关于SaveDC和RestoreDC函数的使用,比如有以下的语句
SaveDC()
oldpen = SelectObject(pen)
oldbrush = SelectObject(brush)
........作画
RestoreDC()
这个时候我使用RestoreDC是不是就是等于
SelectObject(oldpen)
SelectObject(oldbrush)
这两种方法是不是就可以避免内存泄漏了?
...全文
73 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengYuanMSFT 2004-05-02
  • 打赏
  • 举报
回复
Sorry. I meant SaveDC/RestoreDC is more expensive than multiple SelectObject calls.

Right thing to do:
1) Create GDI objects.
2) Select into HDC, if it's needed.
3) Use it.
4) De-select from HDC, if it's needed.
5) DeleteObject.

4) is not a must on NT-based systems. But it's needed on Win9X/ME.

For NT-based systems, use gdiobj.exe from www.fengyuan.com/download to track GDI objects.
cwjcwjcwj 2004-05-02
  • 打赏
  • 举报
回复
谁再来说说比较正规合法的使用GUI资源
elusion 2004-05-02
  • 打赏
  • 举报
回复
DPtoLP(m_bkRect)
cwjcwjcwj 2004-05-02
  • 打赏
  • 举报
回复
to elusion(落)
我确实没有倒过了,主要我对这不太了解。
您的意思就是说,我的程序不一定要这么写,只要在FillRect之前把CRect倒过来就可以了?
那怎么倒呢?
to FengYuanMSFT(袁峰)
1 是的,发现很复杂
2 一定要DeleteObject,才能避免内存泄露吗?
FengYuanMSFT 2004-05-02
  • 打赏
  • 举报
回复
1) How is m_pMemDC being used? Why do you use MM_HIMETRIC in a memory DC? Why do you even need a memory DC.

2) SaveDC/ReasoreDC is more expensive than multiple DeleteObject.
elusion 2004-05-02
  • 打赏
  • 举报
回复
MM_HIMETRIC 是倒向的,y轴反过来。你的CRect倒向没?
cwjcwjcwj 2004-05-02
  • 打赏
  • 举报
回复
to elusion(落)
真的是这样的,自己试看看
cwjcwjcwj 2004-05-02
  • 打赏
  • 举报
回复
希望Mackz(在相互)能够说两句
cwjcwjcwj 2004-05-02
  • 打赏
  • 举报
回复
请大家来讨论
elusion 2004-05-02
  • 打赏
  • 举报
回复
为什么不能?
cwjcwjcwj 2004-05-02
  • 打赏
  • 举报
回复
谢谢你的回答!
这个贴子主要是感谢你帮我看了程序,我实在过意不去
多开出来给你分数的!
我很期待可以收到,您修改后的程序
让我学习一下如何设计这样的东西
菜牛 2004-05-02
  • 打赏
  • 举报
回复
你的问题在于:
1. 在构造函数里创建了GDI资源,但是析构函数没有释放、销毁;
2. 没必要使用SaveDC/RestoreDC来恢复DC设置,因为你并没有修改很多的DC设置,还不如每次重新SeleceObject来得划算;
3. 你把背景、坐标、数据的绘制分在不同的函数中,控件矩形又在另一个函数中调用,很难控制各个参数的一致性,那么最好在各自的处理中来设置DC属性,需要用的的地方进行设置,用完恢复。
4. 总的原则:GDI资源最好随用随开,用完释放、销毁,不要为了节省运算量而作全局性的操作,那样需要很好的程序结构设计能力,在初期没有必要,还是追求稳定性为上。

有时间我把你的代码再改改,加上注释,交流交流。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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