关于在不同映射模式下要注意那些问题,如何避免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)
这两种方法是不是就可以避免内存泄漏了?
...全文
84 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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资源最好随用随开,用完释放、销毁,不要为了节省运算量而作全局性的操作,那样需要很好的程序结构设计能力,在初期没有必要,还是追求稳定性为上。

有时间我把你的代码再改改,加上注释,交流交流。
Light Gui的新特性。 1图层和绘图: 支持多图层,使用与有多图层支持的处理器平台。 支持多图层的软件模拟,支持图层的alpha合并和滑动。 同时支持多种颜色格式的图层,如ragb8888模式、rgb565模式、256色调色板模式。 对每个图层,支持双缓存(double buffer)模式,内部进行了窗口剪切优化。 也支持直画(direct draw)模式,支持内存设备,两者可以配合使用。 支持图层和窗口之前的映射,支持一组窗口动态切换显示到不同大小、不同颜色格式的图层。 支持窗口旋转90度、180度、270度,无需硬件支持。 2风格支持: 支持css风格配置,代码中设置控件的类名,就可以和css配置配合使用。 支持css配置控件不同状态的背景属性,如图片、填充色;前景属性,如图片、颜色;字体属性,如大小、颜色;边框属性,如宽度、颜色、调色板位图、补白等。 支持css配置窗口的一些基本属性,如高宽,透明等。 支持皮肤特性,皮肤的属性包括图标、css配置和调色板位图。 支持多种皮肤,支持在线切换皮肤。 3window模拟器支持: 支持完整的window模拟器,使用visual studio 2005,可以独立于设备,在window环境编写界面代码。 全部由C代码编写,自带基本的C函数库,数学函数库,可以在window,嵌入式设备间无缝移植。 模拟器带来良好的调试特性,界面的相关bug,可以方便的在模拟器上调试,极大的加快软件的开发进度。 支持内存调试模式,可以方便的追踪内存越界,泄漏等问题。 4xml支持: 自带xml解释器,配置文件都使用xml编写,有很好的可读性。 实现了基于xml配置文件的多国语言支持,支持在线切换语言。 5简明易用的控件: 自带多种基本的控件,包括静态文本框、按钮、单行和多行编辑框、列表框、进度条、滚动条、图片、等等。 支持自定义控件,控件代码清晰、简明、容易编写。支持组合控件、对话框控件。配合皮肤配置,能快速实现美工效果和风格。 支持一些较复杂的控件,如文本控件、html显示、软件盘等 6良好的应用移植性 自带基本的C函数库,数学函数库等,可以方便的移植程序库和应用程序。 Light Gui的弱点: 实时性能不是Light GUI强项,不建议使用在实时性要就很高的环境。 在使用风格属性的情况下需要有系统盘的支持,用于存放配置文件和资源。 Light Gui目前是一个图形开发包,没有跨任务的窗口管理系统。 目前只有ucos(增强型,支持系统盘),linux,window平台的移植版本。 Light Gui使用的场合: 需要使用图形库快速实现自有风格的嵌入式设备,比如消费电子设备的二次开发,UI设计。 需要使用Light Gui特性的window程序设计。 Light Gui的商业模式: Light Gui是商业收费软件。 提供软件定制服务。 提供自主设计所需的源代码和库。 Light Gui 的其他特性 Light Gui 主要针对嵌入式操作系统,如嵌入式linux, uC/OS-II 等提供支持。在这些 OS 上,Light Gui 支持以多线程模式运行。其主要技术特性描述如下。 1) 硬件适配性: 可支持各种 32 位处理器架构,如 ARM、MIPS、PowerPC、Blackfin等。 支持各种灰度,彩色显示设备。 可支持各种输入设备,键盘(Keypad)、触摸屏、遥控器等等。 2) 资源消耗: Light GUI 的静态存储随配置选项的不同不同,最少需占用 800K 静态存储空间。 Light GUI 启动后,初始占用动态存储空间最小为128k。建议系统内存为 2MB 以上。 3) 操作系统适配性: 目前支持uC/OS-II 等操作系统,也可以运行在 Linux/uClinux 操作系统之上,Light GUI自带基础的c函数库,可以方便的移植到支持frambuffer的设备上。 针对嵌入式系统的特殊支持,包括一般性的 I/O 流操作,字节序相关函数等。 4) 窗口子系统特性: 完备的任务内窗口机制和消息传递机制。 5) 图形子系统特性: 提供有增强 GDI 函数,包括光栅操作、复杂区域处理、椭圆、圆弧、多边形以及区域填充等函数。 在提供有兼容于 C99 规范的数学库平台上,还提供有高级二维绘图函数。 通过 Light GUI 的图形抽象层及图形引擎技术,我们也可以让上述高级 GDI 接口在低端显示屏上实现。 各种流行图像文件的支持,包括 Windows BMP、GIF、JPEG、PNG 等(JPEG

16,548

社区成员

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

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

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