缘起是看到这个帖子,
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()也是指向不明确的。
看上去这个事能看明白了。