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的使用数还是很多,各位帮我解决下啊!
...全文
216 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等就需要好好考虑了 这些东西对资源占用比较大
而且多次创建 删除也同样会造成系统速度慢。

16,547

社区成员

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

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

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