CImage封装gdiplus的初始化和引用计数
2015-06-04 12:52
721 查看
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
CImage内部封装了一个变量
static
CInitGDIPlus s_initGDIPlus;
该变量实现了对gdiplus的初始化和销毁,基于引用计数的方式,实现了多个CImage实例的共享gdiplus的生命周期。
CImage内部封装了一个变量
static
CInitGDIPlus s_initGDIPlus;
该变量实现了对gdiplus的初始化和销毁,基于引用计数的方式,实现了多个CImage实例的共享gdiplus的生命周期。
class CInitGDIPlus { public: CInitGDIPlus() throw(); ~CInitGDIPlus() throw(); bool Init() throw(); void ReleaseGDIPlus() throw(); void IncreaseCImageCount() throw(); void DecreaseCImageCount() throw(); private: ULONG_PTR m_dwToken; CRITICAL_SECTION m_sect; LONG m_nCImageObjects; }; inline CImage::CInitGDIPlus::CInitGDIPlus() throw() : m_dwToken( 0 ), m_nCImageObjects( 0 ) { __try { InitializeCriticalSection(&m_sect); } __except( STATUS_NO_MEMORY == GetExceptionCode() ) { AtlThrow( E_OUTOFMEMORY ); } } inline CImage::CInitGDIPlus::~CInitGDIPlus() throw() { ReleaseGDIPlus(); DeleteCriticalSection(&m_sect); } inline bool CImage::CInitGDIPlus::Init() throw() { EnterCriticalSection(&m_sect); bool fRet = true; if( m_dwToken == 0 ) { Gdiplus::GdiplusStartupInput input; Gdiplus::GdiplusStartupOutput output; Gdiplus::Status status = Gdiplus::GdiplusStartup( &m_dwToken, &input, &output ); if( status != Gdiplus::Ok ) fRet = false; } LeaveCriticalSection(&m_sect); return fRet; } inline void CImage::CInitGDIPlus::ReleaseGDIPlus() throw() { EnterCriticalSection(&m_sect); if( m_dwToken != 0 ) { Gdiplus::GdiplusShutdown( m_dwToken ); } m_dwToken = 0; LeaveCriticalSection(&m_sect); } inline void CImage::CInitGDIPlus::IncreaseCImageCount() throw() { EnterCriticalSection(&m_sect); m_nCImageObjects++; LeaveCriticalSection(&m_sect); } inline void CImage::CInitGDIPlus::DecreaseCImageCount() throw() { EnterCriticalSection(&m_sect); if( --m_nCImageObjects == 0 ) ReleaseGDIPlus(); LeaveCriticalSection(&m_sect); } |
相关文章推荐
- hdu 2051 Bitset (java)
- 5、vsphere6-ESXI主机的安装及配置
- Access denied for user 'root'@'localhost' (using password: YES)解决方法
- HTML学习笔记-v1.2
- Javascript实现import动态导入文件方法
- javascript 将字符串转化成json对象
- Spring学习笔记(二)IOC注入方式
- 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
- 5.18
- hdu 2049 不容易系列之(4)——考新郎
- 《自己动手写框架2》:用200行的DBF解析器来展示良好架构设计
- POJ 3281 牛双选问题
- DM9000裸机驱动及ARP实现
- Sqlite数据库sqlite3命令
- arduino 红外遥控数码管
- Effective C++ 条款42
- #F面经#Facebook
- 4、vsphere6-Vcenter安装及配置
- Android LayoutInflater详解
- opencv仿射变换GetAffineTransform的总结