您的位置:首页 > 其它

CImage封装gdiplus的初始化和引用计数

2015-06-04 12:52 721 查看
(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);
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: