一直都不怎么注意 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返回的是上一個被選對象的指針,而不是當前的 &newPen。
5
pDC->MoveTo(10, 10);
6
pDC->Lineto(110, 10);
7
pDC->SelectObject(pOldPen);//newPen 落選
8
}
9

2



3

4

5

6

7

8

9

如第四行所示,原來SelectObject返回的是上一個被選對象的指針。當 newPen 落選之后,也就從設備環境中分離了,function 退出后,它就被自動銷毀了。
既然落選之后就可以被自動刪除,那么選擇其它GDI對象也能刪除自己創建的GDI對象。為了不造成內存的浪費,我們可以選擇庫存的GDI對象,由于它們是系統的一部分,所以不用擔心它們會造成浪費:
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 被銷毀。

2



3

4

5

6

7

8

9
