Windows GDI:CGdiObject使用总结

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

一、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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7岁儿童半夜呕吐怎么办 一个月宝宝粘人怎么办 2岁宝宝太粘人了怎么办 8个月宝宝很粘人怎么办 7个月宝宝呕吐是怎么办 一个月婴儿粘人怎么办 八个月小孩粘人怎么办 一岁的宝宝粘人怎么办 六个月宝宝粘人爱哭怎么办 摔伤结巴里面灌脓了怎么办 两周半的宝宝说话结巴怎么办 孩子两周说话结巴怎么办 名字取了生僻字考大学怎么办 淘宝客服一直不说话怎么办 淘宝客服不说话也不发货怎么办 面对不说话的客人怎么办? 卖家客服不回复怎么办 2周小孩说话结巴怎么办 微信群里只领红包不说话的人怎么办 躺在微信不说话的客户怎么办 9岁儿童说话结巴怎么办 5岁儿童说话结巴怎么办 京东客服不说话怎么办 两岁宝宝说话有点结巴怎么办 孩子不敢跟外人说话怎么办? 孩子不爱跟外人说话怎么办 别人说我不说话怎么办 衣服屁股那块变亮怎么办 小孩家里说话外面不说话怎么办 2个月小宝宝便秘怎么办 3个月小宝宝便秘怎么办 微信客户不说话怎么办 一岁半宝宝便秘肛裂怎么办 网恋现在都不说话了怎么办 宝宝便秘四天了怎么办 月子里小孩吐奶怎么办 月子里的小孩吐奶怎么办 婴儿吃多了吐奶怎么办 20个月孩子便秘怎么办 一岁宝宝肛裂怎么办 婴儿吃饱了吐奶怎么办