GDI占用问题,大家帮我解答下!

bitwwzhang130 2009-01-13 10:03:54
问题1:如何有效的降低GDI的使用数,用GDIPool?
问题2:

CPen pen( PS_SOLID, 0, clrArrow );
CBrush* pOldBrush = dc.SelectObject( &brush );
CPen* pOldPen = dc.SelectObject( pen );
dc.Polygon( arPoints, POINTS_COUNT );
dc.SelectObject( pOldPen );
dc.SelectObject( pOldBrush );

这样写代码会增加程序中GDI(Pen和Brush)的个数吗?
问题3:我用了GDIPool来保存同样的CPen对象,当再有需要的地方,就去GDIPool中get,如果GDIPool中没有 再分配。
结果我做了测试,每次都可以从GDIPool中得到,但CPen的使用数还是很多,各位帮我解决下啊!
...全文
209 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
scq2099yt 2009-01-14
  • 打赏
  • 举报
回复
创建和删除配对问题应该不大
bitwwzhang130 2009-01-14
  • 打赏
  • 举报
回复
有点明白了,还得再研究研究,如果我用GDI+中的Brush或者Pen,应该注意些什么呢?怎么使用才能保证不增加GDI数呢?
各位给点资料或者代码什么的,谢谢啊
Allen_zhang 2009-01-14
  • 打赏
  • 举报
回复
问题2中不会增加GDI,一般不是你create的不用delete。
不过你的刷子brush是怎样生成的?记得要delete掉
bitwwzhang130 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Show_Mike 的回复:]
你可能对控件绘制有误解:多个控件可以用同一CPEN和CBrush绘制,没有必要一个控件一个gdi对象;另外,就是创建了新的笔刷,使用后及时删除.
[/Quote]
我想的就是用一个GDI对象绘制多个控件,这样就能在创建控件比较多时,减少GDI的使用,那我该如何做呢?请指点我一下
做鸡真好吃 2009-01-14
  • 打赏
  • 举报
回复
yep
Show_Mike 2009-01-14
  • 打赏
  • 举报
回复
你可能对控件绘制有误解:多个控件可以用同一CPEN和CBrush绘制,没有必要一个控件一个gdi对象;另外,就是创建了新的笔刷,使用后及时删除.
Cpp权哥 2009-01-14
  • 打赏
  • 举报
回复
把GDI对象作为你的窗口对象的一个数据成员,在构造函数或者别的适当的地方初始化,在析构函数中释放。
梧桐168 2009-01-14
  • 打赏
  • 举报
回复
使用对象来封装
class CSelPen : public CGDIObject<CPen>
{
public:
CSelPen(CDC * pDC, COLORREF col, int sty=PS_SOLID, int wid=1)
: CGDIObject<CPen>(pDC)
{
VERIFY(m_cNewObj.CreatePen(sty, wid, col));
Select(&m_cNewObj);
}

CSelPen(CDC * pDC, int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0,
const DWORD* lpStyle = NULL) : CGDIObject<CPen>(pDC)
{
VERIFY(m_cNewObj.CreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle));
Select(&m_cNewObj);
}
};
bitwwzhang130 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fairyprince 的回复:]
如果只建一个CPen 应该是不会增回GDI句柄数所,还有你那么肯定是 Pen和Brush 增加的,而不是其它?,
[/Quote]
我是用一个工具查看的
songsu 2009-01-13
  • 打赏
  • 举报
回复
那你就在BUTTON基类的OnPaint里面处理,只需要用到一个CPaintDC,并在 OnPaint 执行完后,自动释放 CPaintDC 所占用的系统资源,不需要手动关闭。
fairyprince 2009-01-13
  • 打赏
  • 举报
回复
如果只建一个CPen 应该是不会增回GDI句柄数所,还有你那么肯定是 Pen和Brush 增加的,而不是其它?,
bitwwzhang130 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 songsu 的回复:]
如果200个BUTTON,且效果都是一样的话,那就把它做成一个BUTTON基类,不可能都在一个窗口的OnPaint里面处理这200个BUTTON的自绘吧
[/Quote]
就是做成基类的形式,我要开发的是一个控件库,想让使用者创建很多同样控件时不用占用那么GDI
songsu 2009-01-13
  • 打赏
  • 举报
回复
如果200个BUTTON,且效果都是一样的话,那就把它做成一个BUTTON基类,不可能都在一个窗口的OnPaint里面处理这200个BUTTON的自绘吧
bitwwzhang130 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fairyprince 的回复:]
代码不全
[/Quote]
这个类里边就在这里用了GDI,请问还要哪部分的代码?
[Quote=引用 3 楼 hemdacker 的回复:]
不要用GDIPool,用的时候创建或保存到类变量,注意删除就行了。建议看看msdn,都说的很清楚防止gdi对象泄露
[/Quote]
另外,我们要实现一个基础控件库,主要想解决GDI占用数量多的问题,如果创建200个同样的BUTTON,就必须要使用200个CPen吗?
能不能给个创建后及时释放的实例代码?

fairyprince 2009-01-13
  • 打赏
  • 举报
回复
代码不全
hemdacker 2009-01-13
  • 打赏
  • 举报
回复
不要用GDIPool,用的时候创建或保存到类变量,注意删除就行了。建议看看msdn,都说的很清楚防止gdi对象泄露
bitwwzhang130 2009-01-13
  • 打赏
  • 举报
回复
各位牛人,帮帮忙啊
Chivalry 2009-01-13
  • 打赏
  • 举报
回复
pen.DeleteObject();
pOldBrush->DeleteObject();
pOldPen->DeleteObject();

只要不出错,尽可能多的DeleteObject
Tinary3v0 2009-01-13
  • 打赏
  • 举报
回复
把 经常用的CPen CBrush定义成类的成员函数 析构的时候再删除
画笔画刷占用资源比较少 即便是经常用经常释放也没有什么问题 如果是
位图CBitmap CDC* CDC等就需要好好考虑了 这些东西对资源占用比较大
而且多次创建 删除也同样会造成系统速度慢。
下面是网络收集 WTL for MFC Programmers, Chinese Version Prologue WTL for MFC Programmers, Part I - ATL GUI Classes - WTL WTL for MFC Programmers, Part II - WTL GUI Base Classes - WTL WTL for MFC Programmers, Part III - Toolbars and Status Bars - WTL WTL for MFC Programmers, Part IV - Dialogs and Controls - WTL WTL for MFC Programmers, Part IX - GDI Classes, Common Dialogs, and Utility Classes - WTL WTL for MFC Programmers, Part V - Advanced Dialog UI Classes - WTL WTL for MFC Programmers, Part VI - Hosting ActiveX Controls - WTL WTL for MFC Programmers, Part VII - Splitter Windows - WTL WTL for MFC Programmers, Part VIII - Property Sheets and Wizard 由于工作的需要经常开发一些COM组件,在要求不能使用MFC的场合就是用ATL。ATL提供了对窗口的面向对象地封装和简单的消息映射机制,但是ATL过于简单,用它开发应用程序几乎不可能。要想让ATL具备界面框架解决方案的功能还需要做很多事情,幸运的是WTL就做了这些事情。WTL是个很奇特的东西,它由微软公司一群热情的程序员维护,它从未出现在微软的官方产品名单上,但可以从微软的官方网站下载最新的WTL。它没有正式的文档支持,用WTL做关键字在MSDN中检索只能得到0个结果,但是全世界的开发网站上都有针对WTL的讨论组和邮件列表,任何问题都会得到热情的解答。我认真地对比了MFC和WTL,发现二者有很多相通之处,MFC的功能几乎都能在WTL中实现,只是方法不同而已。我几乎不费吹灰之力就将以前写的一个MFC程序用WTL改写了,使用静态链接的WTL程序比使用动态链接的MFC程序还要小,资源占用只有MFC程序的一半。 但是一时的热情不能解决文档缺乏的困扰,虽然网上有很多使用WTL的例子和说明文章,几乎把MFC能实现的各种稀奇古怪的效果都实现了,但都是着眼于局部问题得解决,缺乏系统地全面地介绍WTL的文章。就在这个时候我看到了迈克尔.敦(Michael Dunn)的“WTL for MFC Programmers”系列文章,我的感觉和1995年我第一次见到MSDN时一样,几乎是迫不及待地将其读完,同时也萌发了将其翻译成汉语的冲动。于是给Michael写了封邮件,希望能够得到授权将他的文章翻译成汉语(事实上在这之前我已经翻译了两章了)。在得到授权确认后才发现这个工作是多么的困难,但为时已晚,只能硬着头皮撑下去。

16,548

社区成员

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

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

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