Last Updated 2004/03/30
Programming Tips Visual C++ MFC GDI  索 引 
GDIオブジェクト
2004/03/30

GDI オブジェクトは作成したら削除しなければならない.

    CPen myPen, *pOldPen;
    myPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    pOldPen = DC.SelectObject(&myPen);
    ....
    DC.SelectObject(pOldPen);
    myPen.DeleteObject();

これが定形な処理である.
では,ペンを2度選択する場合はどうするのか?

    CPen myPen1, myPen2, *pOldPen;
    myPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    pOldPen = DC.SelectObject(&myPen1);
    ....
    myPen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
    pOldPen = DC.SelectObject(&myPen2);
    ....
    DC.SelectObject(pOldPen);
    myPen.DeleteObject();

2回目の SelectObject() で元のペンを確保する必要はない.
(逆に,同関数内で元の状態を確保してはいけない)

1度元の状態を格納してしまえばあとは何度 SelectObject() を行っても問題はない.

GDI オブジェクトは作成したら削除しなければならない.しかし SelectObject() したままでは削除できないので,前の状態に戻してから削除するのである.

CreateObject() したものは DeleteObject() しなければならないが,コンストラクタにて暗黙に CreaateObject() されたものは削除する必要はない(削除してもかまわない)
デストラクタにて暗黙に DeleteObject() されるからである.


SelectObject() にて元の状態に戻さないとどうなるか?
DeleteObject() が失敗する.Windows95 系では TRUE が返るが実際にはプロセス終了まで迷子なオブジェクトとなる.
Windows3.1 や WindowsNT などでは FALSE が返る.


参照
前後のTips
GDIオブジェクト

DSS ProgrammingTipsCGI Ver2.02