找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2356|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

對(duì)話框OnCtlColor的資源泄露問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102668 發(fā)表于 2016-1-16 03:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
上回說到使用gdiview可以查看資源的使用情況, 可以大概判斷下是什么資源泄露了, 但是定位具體的問題, 還要回到代碼中來,還好代碼比較少,分析分析,基本也就能找到地方,這里問題發(fā)生在這個(gè)對(duì)話框



在OnCtlColor里面犯了錯(cuò)誤,

HBRUSH b=CreateSolidBrush(m_colorBoard);
return b;
原來沒有注意, 這個(gè)mfc是不會(huì)釋放Brush的,問題找到了, 解決起來貌似很容易了,其實(shí)這個(gè)解決也正是癥結(jié)所在,隨便上網(wǎng)找了一下,大家都是在說的解決辦法是定義成員變量, 查看msdn, 也是這么說的,但是成員變量有一個(gè)問題, 就是一般要在構(gòu)造函數(shù)中創(chuàng)建, 在析構(gòu)函數(shù)中刪除, 這樣的用法針對(duì)一次設(shè)置顏色, 沒有問題。但是我的需求是在對(duì)話框運(yùn)行過程中動(dòng)態(tài)修改控件的背景色,順著這樣的思路自然想到在OnCtlColor, 先刪除,然后再重新創(chuàng)建, 如下面這樣
if (m_pBrushBoard != NULL)
        {
            m_pBrushBoard->DeleteObject();
            m_pBrushBoard = NULL;
        }
        
        if (m_pBrushBoard == NULL)
        {
            m_pBrushBoard->CreateSolidBrush(m_colorBoard);
        }

但是覺得這樣,盡管這是大多數(shù)人的解決辦法,

到msdn社區(qū)搜索了一下,調(diào)用下面的這個(gè)函數(shù),就可以了, 個(gè)人覺得這個(gè)方法更好一些,

SetDCBrushColor(pDC->m_hDC, m_colorBoard);
        HBRUSH b= (HBRUSH)::GetStockObject(DC_BRUSH);
        return b;




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表