一、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