Windows GDI:CGdiObject使用总结

来源:互联网 发布:php获取html表单数据 编辑:程序博客网 时间:2024/06/16 10:16

一、Win32下的GdiObject操作

1、获取系统自带的GdiObject

HGDIOBJ GetStockObject(int fnObject)
fnObject:
BLACK_BRUSH — Black brush.
HOLLOW_BRUSH — Hollow brush (equivalent to NULL_BRUSH).
BLACK_PEN — Black pen.
……
Note: It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject.

2、创建GdiObject

HPEN CreatePen(    int fnPenStyle,    // pen style  int nWidth,        // pen width    COLORREF crColor   // pen color);HBRUSH CreateSolidBrush(  COLORREF crColor   // brush color value);HFONT CreateFont(...)

通过CreateXXX创建的GdiObject,在使用完之后一定要DeleteObject,否则会有资源泄露.

二、CGdiObject

class CGdiObject : public CObject{public:    HGDIOBJ m_hObject;   //A HANDLE containing the HBITMAP, HPALETTE, HRGN, HBRUSH, HPEN, or HFONT attached to this object.     BOOL Attach(HGDIOBJ hObject);    HGDIOBJ Detach();    static CGdiObject* FromHandle(HGDIOBJ hObject);    static void DeleteTempMap( );}

1、构造函数

CGdiObject::CGdiObject(){     m_hObject = NULL; }

2、析构函数

CGdiObject::~CGdiObject(){    DeleteObject(); }BOOL CGdiObject::DeleteObject(){    if (m_hObject == NULL)        return FALSE;    return ::DeleteObject(Detach());}

析构函数中有DeleteObject

3、Attach与Detach

原理同CDC

BOOL CGdiObject::Attach(HGDIOBJ hObject){    if (hObject == NULL)    {        return FALSE;    }    m_hObject = hObject;    CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist    pMap->SetPermanent(m_hObject, this);    return TRUE;}HGDIOBJ CGdiObject::Detach(){    HGDIOBJ hObject = m_hObject;    if (hObject != NULL)    {        CHandleMap* pMap = afxMapHGDIOBJ(); // don't create if not exist        if (pMap != NULL)            pMap->RemoveHandle(m_hObject);    }    m_hObject = NULL;    return hObject;}

4、FromHandle

同CDC::FromHandle

CGdiObject* PASCAL CGdiObject::FromHandle(HGDIOBJ h){    CHandleMap* pMap = afxMapHGDIOBJ(TRUE); //create map if not exist    CGdiObject* pObject = (CGdiObject*)pMap->FromHandle(h);    return pObject;}

5、DeleteTempMap

Called automatically by the CWinApp idle-time handler, DeleteTempMap deletes any temporary CGdiObject objects created by FromHandle.
DeleteTempMap detaches the Windows GDI object attached to a temporary CGdiObject object before deleting the CGdiObject object.
这个和CDC::DeleteTempMap是一致的,也即只会delete temporary CGdiObject object,but 不会对关联的Windows GDI object调用::DeleteObject

6、CreateStockObject

BOOL CreateStockObject(   int nIndex );

对应Win32SDK中的GetStockObject

0 0
原创粉丝点击