上回說到使用gdiview可以查看資源的使用情況, 可以大概判斷下是什么資源泄露了, 但是定位具體的問題, 還要回到代碼中來,還好代碼比較少,分析分析,基本也就能找到地方,這里問題發生在這個對話框

在OnCtlColor里面犯了錯誤,
HBRUSH b=CreateSolidBrush(m_colorBoard);
return b;
原來沒有注意, 這個mfc是不會釋放Brush的,問題找到了, 解決起來貌似很容易了,其實這個解決也正是癥結所在,隨便上網找了一下,大家都是在說的解決辦法是定義成員變量, 查看msdn, 也是這么說的,但是成員變量有一個問題, 就是一般要在構造函數中創建, 在析構函數中刪除, 這樣的用法針對一次設置顏色, 沒有問題。但是我的需求是在對話框運行過程中動態修改控件的背景色,順著這樣的思路自然想到在OnCtlColor, 先刪除,然后再重新創建, 如下面這樣
if (m_pBrushBoard != NULL)
{
m_pBrushBoard->DeleteObject();
m_pBrushBoard = NULL;
}
if (m_pBrushBoard == NULL)
{
m_pBrushBoard->CreateSolidBrush(m_colorBoard);
}
但是覺得這樣,盡管這是大多數人的解決辦法,
到msdn社區搜索了一下,調用下面的這個函數,就可以了, 個人覺得這個方法更好一些,
SetDCBrushColor(pDC->m_hDC, m_colorBoard);
HBRUSH b= (HBRUSH)::GetStockObject(DC_BRUSH);
return b;
|