关闭

动态占用资源的gdi问题

524人阅读 评论(0) 收藏 举报

缘起是看到这个帖子,

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()也是指向不明确的

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:303629次
    • 积分:4458
    • 等级:
    • 排名:第6909名
    • 原创:145篇
    • 转载:44篇
    • 译文:0篇
    • 评论:288条
    最新评论