日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GDI对象和CDC的使用方法(防止资源泄漏)

發(fā)布時(shí)間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GDI对象和CDC的使用方法(防止资源泄漏) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1:CDC方面:
???????CDC有三種使用方式
???????一種是獲得,包括GETDC和GETWINDOWDC,這種CDC是引用,使用完了一定要ReleaseDC,不釋放就會(huì)這個(gè)引用過來的CDC資源泄漏,千萬不能用DeleteDC,會(huì)導(dǎo)致報(bào)錯(cuò)或程序崩潰。
???????還有一種就是創(chuàng)建,一般是CreateDC,CreateCompatibleDC等,這是創(chuàng)建一個(gè)新的DC,使用完了要DeleteDC,如果是NEW的還需要DELETE。如果不是指針,而是一個(gè)CDC對(duì)象(CDC?_dc;),那在使用后也可以不DeleteDC,因?yàn)镃DC對(duì)象的析構(gòu)函數(shù)會(huì)調(diào)用DeleteDC。
??????最后一種是臨時(shí)的CDC對(duì)象,(CDC* pDC?=?CDC::FromHandle(lpDrawItemStruct->hDC);),這種CDC在我們重載控件的DrawItem函數(shù)中經(jīng)常用到,這類CDC是由系統(tǒng)在空閑時(shí)自動(dòng)釋放(沒有測(cè)試過是否可以手動(dòng)釋放,有興趣的朋友可以自己試試)。

2:下面說下GDI對(duì)象
??????我的帖子舉例的情況是不會(huì)造成內(nèi)存泄漏的,SelectObject返回的指針是一個(gè)臨時(shí)對(duì)象的指針,這個(gè)指針是保存在系統(tǒng)的一個(gè)MAP里的,對(duì)于MAP里的不使用的對(duì)象,系統(tǒng)會(huì)在空閑時(shí)自動(dòng)釋放。
那個(gè)例子的結(jié)果就是,把新的圖片放到了那個(gè)CDC里面,CDC里面的默認(rèn)或是原來的圖片被替換刪除了,再想用的時(shí)候就沒有了。舉例
1
2
3
4
pDC->TextOut("11");
pDC->SelectObject(&cpen);
pDC->TextOut("22");

???????cpen一個(gè)粗線條的筆,正常的想法是11是系統(tǒng)默認(rèn)粗細(xì)的筆,22是粗線條,因?yàn)槟銢]有選回系統(tǒng)默認(rèn)的CPEN(?pDC->SelectObject(?pOldPen?);),當(dāng)你第二次執(zhí)行這段代碼的時(shí)候,11和22都是粗線條的,因?yàn)槟J(rèn)的筆已經(jīng)被你改變了。

3:舉例一:

void?CMyView::OnPaint(?CDC*?pDC?)
??{
??CBitmap?bmp;
??CBitmap*?pOldBmp;
??bmp.LoadBitmap(IDB_MYBMP);
??pOldBmp?=?pDC->SelectObject(?&bmp?);
??…
??if(?Something()?){
??return;
??}
??pDC->SelectObject(?pOldBmp?);
??return;
??}

??????此段代碼最大的問題就是在第一個(gè)return語句,如果在這種情況下,就執(zhí)行選回原來的畫刷,導(dǎo)致資源不釋放,

4:舉例二:

HBRUSH CCCIMSystemDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
?HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

?// TODO:??在此更改 DC 的任何屬性
?pDC->SetBkMode(TRANSPARENT);
HBRUSH B=CreateSolidBrush(RGB(204,204,255));
?
?return (HBRUSH)B;
?// TODO:??如果默認(rèn)的不是所需畫筆,則返回另一個(gè)畫筆
?return hbr;
}
???????此段代碼主要是修改對(duì)話框以及控件的背景顏色,但是長(zhǎng)時(shí)間運(yùn)行將會(huì)發(fā)現(xiàn)大量資源泄漏。原因是每次進(jìn)入此函數(shù)都會(huì)創(chuàng)建新的HBRUSH B而此對(duì)象有作為此函數(shù)的返回,即資源不會(huì)得到釋放,

原文:https://blog.csdn.net/lixianjun913/article/details/9664163?
?

總結(jié)

以上是生活随笔為你收集整理的GDI对象和CDC的使用方法(防止资源泄漏)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。