一直都不怎么注意 function 的返回類型,今天看到刪除GDI對象一文時,對保存舊GDI對象的代碼頗為不解,遂查之,無果。重讀之,恍然大悟!
先看看代碼:
1
void CMyView::OnDraw(CDC* pDC)
2

{
3
CPen newPen(PS_DASHDOTDOT, 2, (COLOREF) 0);//2個像素寬的黑色Pen。
4
CPen* pOldPen = pDC->SelectObject(&newPen);//SelectObject返回的是上一個被選對象的指針,而不是當(dāng)前的 &newPen。
5
pDC->MoveTo(10, 10);
6
pDC->Lineto(110, 10);
7
pDC->SelectObject(pOldPen);//newPen 落選
8
}
9
void CMyView::OnDraw(CDC* pDC)2


{3
CPen newPen(PS_DASHDOTDOT, 2, (COLOREF) 0);//2個像素寬的黑色Pen。4
CPen* pOldPen = pDC->SelectObject(&newPen);//SelectObject返回的是上一個被選對象的指針,而不是當(dāng)前的 &newPen。5
pDC->MoveTo(10, 10);6
pDC->Lineto(110, 10);7
pDC->SelectObject(pOldPen);//newPen 落選8
}9

如第四行所示,原來SelectObject返回的是上一個被選對象的指針。當(dāng) newPen 落選之后,也就從設(shè)備環(huán)境中分離了,function 退出后,它就被自動銷毀了。
既然落選之后就可以被自動刪除,那么選擇其它GDI對象也能刪除自己創(chuàng)建的GDI對象。為了不造成內(nèi)存的浪費(fèi),我們可以選擇庫存的GDI對象,由于它們是系統(tǒng)的一部分,所以不用擔(dān)心它們會造成浪費(fèi):
1
void CMyView::OnDraw(CDC* pDC)
2

{
3
CPen newPen(PS_DASHDOTDOT, 2, (COLOREF) 0);//2個像素寬的黑色Pen。
4
pDC->SelectObject(&newPen);
5
pDC->MoveTo(10, 10);
6
pDC->Lineto(110, 10);
7
pDC->SelectStockObject(BLACK_PEN);//newPen 落選
8
}
9
//function 退出,newPen 被銷毀。
void CMyView::OnDraw(CDC* pDC)2


{3
CPen newPen(PS_DASHDOTDOT, 2, (COLOREF) 0);//2個像素寬的黑色Pen。4
pDC->SelectObject(&newPen); 5
pDC->MoveTo(10, 10);6
pDC->Lineto(110, 10);7
pDC->SelectStockObject(BLACK_PEN);//newPen 落選8
}9
//function 退出,newPen 被銷毀。
