动态占用资源的gdi问题

缘起是看到这个帖子,

http://topic.csdn.net/t/20050617/11/4088812.html

http://topic.csdn.net/u/20070211/09/7c314545-3b40-4e05-86ed-7e31812cde20.html

这两个帖子里面的gdi资源问题,长时间运行崩溃或者无颜色,实质是动态生成了过多的资源,而没有释放。


这个问题是设计者没有关注好资源的使用,盲目的动态生成。解决这个问题的关键是注意不要反复生成,相应的应当有几个可预计的资源缓存。

比如在使用

HBRUSH   CSaleMang::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)   

HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor); 

//   TODO:   Change   any   attributes   of   the   DC   here 
if(nCtlColor==CTLCOLOR_LISTBOX) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(233,233,220)); 
HBRUSH   b=CreateSolidBrush(RGB(233,233,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_SCROLLBAR) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(233,233,220)); 
HBRUSH   b=CreateSolidBrush(RGB(233,233,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_EDIT) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(233,233,220)); 
HBRUSH   b=CreateSolidBrush(RGB(233,233,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_STATIC) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(160,180,220)); 
HBRUSH   b=CreateSolidBrush(RGB(160,180,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_DLG) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(160,180,220)); 
HBRUSH   b=CreateSolidBrush(RGB(160,180,220)); 
return   b; 

//   TODO:   Return   a   different   brush   if   the   default   is   not   desired 
return   hbr; 

这个就是其中一个崩溃的实例,其中的CreateSolidBrush就是没有限制的,随着事件函数的调用反复生成,造成资源占用。

解决这个问题的方式就是在先生成几个HBRUSH变量备用,在有必要的时候,比如可以被客户定制的时候,先要DeleteObject()已经create的,而后再create一个也就是说,create的变量在DeleteObject()前一直存在,是一片内存资源被占用了,如果不是类成员变量或者全局变量的话,即使有DeleteObject()也是指向不明确的

看上去这个事能看明白了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值