CImage封装gdiplus的初始化和引用计数
来源:互联网 发布:ubuntu sudo在哪里 编辑:程序博客网 时间:2024/05/16 19:30
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
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);
}
- CImage封装gdiplus的初始化和引用计数
- CImage 析构 引用计数
- gdiplus.h的引用
- CImage转换Gdiplus::Bitmap
- DLL中GDIPlus初始化和退出时注意的问题
- 页面的引用计数和get_user_pages
- 变量的内部存储:引用和计数
- 引用计数的原理和实例
- 引用计数的原理和实例
- 普通引用和const引用的初始化
- 普通引用和const引用的初始化
- 普通引用和const引用的初始化
- 对象、引用和引用计数
- python的引用计数
- 自己的引用计数
- GC的引用计数
- 引用计数的问题
- GdiPlus控件Static和Button的使用
- hdu 2049 不容易系列之(4)——考新郎
- javascript 将字符串转化成json对象
- 树莓派+python opencv实现远程监控
- HTML学习笔记-v1.2
- Spring学习笔记(二)IOC注入方式
- CImage封装gdiplus的初始化和引用计数
- 5.19
- 大脑的奥秘eeg-百家讲坛(转)
- hdu 2051 Bitset (java)
- LBP代码资源整理收集
- 单例模式的简单创建 方法
- WPF DataGrid、ListView 简单绑定
- 你用 C 语言做过哪些有意思的事??
- hdu 2052 Picture(java)