SystemImageList.cpp
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:4k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////
  2. // Copyright (C) 1998 by Mark Otway
  3. // All rights reserved
  4. //
  5. // Distribute freely, except: don't remove my name from the source or
  6. // documentation (don't take credit for my work), mark your changes
  7. // (don't get me blamed for your possible bugs), don't alter or remove
  8. // this notice.
  9. // No warrantee of any kind, express or implied, is included with this
  10. // software; use at your own risk, responsibility for damages (if any) to
  11. // anyone resulting from the use of this software rests entirely with the
  12. // user.
  13. //////////////////////////////////////////////////////////////////////
  14. // SystemImageList.cpp: implementation of the CSystemImageList class.
  15. //////////////////////////////////////////////////////////////////////
  16. #include "stdafx.h"
  17. #include "SystemImageList.h"
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[]=__FILE__;
  21. #define new DEBUG_NEW
  22. #endif
  23. //////////////////////////////////////////////////////////////////////
  24. // Construction/Destruction
  25. //////////////////////////////////////////////////////////////////////
  26. CImageList * CSystemImageList::m_gpLargeImageList = NULL;
  27. CImageList * CSystemImageList::m_gpSmallImageList = NULL;
  28. int CSystemImageList::m_gRefCount = 0;
  29. void CSystemImageList::DestroyGlobalList( CImageList *& rpImageList )
  30. {
  31.     if( rpImageList )
  32.     {
  33. // Detach the image list, otherwise when we delete the 
  34. // lists we'll deallocate the system-wide image list
  35. rpImageList->Detach();
  36. delete rpImageList;
  37. rpImageList = NULL;
  38.     }
  39. }
  40. BOOL CSystemImageList::InitGlobalList( CImageList *& rpImageList, BOOL bSmall /* = TRUE */ )
  41. {
  42.     BOOL bRet = FALSE;
  43.     if( ! rpImageList )
  44.     {
  45. // Create the singleton CImageList object, which will be
  46. // passed around to anyone who needs it
  47. rpImageList = new CImageList;
  48.     
  49. if( rpImageList )
  50. {
  51.     SHFILEINFO sfi;
  52.     DWORD dwFlags = SHGFI_USEFILEATTRIBUTES|SHGFI_SYSICONINDEX;
  53.     
  54.     if( bSmall )
  55. dwFlags |= SHGFI_SMALLICON;
  56.     size_t size = sizeof( SHFILEINFO );
  57.     // Load the image list - use an arbitrary file extension for the
  58.     // call to SHGetFileInfo (we don't want to touch the disk, so use
  59.     // FILE_ATTRIBUTE_NORMAL && SHGFI_USEFILEATTRIBUTES).
  60.     rpImageList->Attach( (HIMAGELIST)SHGetFileInfo( ".txt", FILE_ATTRIBUTE_NORMAL, 
  61.     &sfi, size, dwFlags ) );
  62.     
  63.     // Make the background colour transparent, works better for lists etc.
  64.     rpImageList->SetBkColor( CLR_NONE );
  65.     bRet = TRUE;
  66. }
  67.     }
  68.     return( bRet );
  69. }
  70. CSystemImageList::CSystemImageList()
  71. {
  72.     // Initialise both lists when the first instance is created
  73.     if( m_gRefCount == 0 )
  74.     {
  75. ASSERT( ! m_gpSmallImageList && ! m_gpLargeImageList );
  76. InitGlobalList( m_gpSmallImageList, TRUE );
  77. InitGlobalList( m_gpLargeImageList, FALSE );
  78.     }
  79.     // Keep a reference count
  80.     m_gRefCount++;
  81. }
  82. CSystemImageList::~CSystemImageList()
  83. {
  84.     // One less instance using the lists
  85.     m_gRefCount--;
  86.     // Nobody's using the list now, so throw 'em away
  87.     if( m_gRefCount == 0 )
  88.     {
  89. DestroyGlobalList( m_gpLargeImageList );
  90. DestroyGlobalList( m_gpSmallImageList );
  91.     }
  92. }
  93. // Helper function to get the icon index of a particular file/object
  94. int CSystemImageList::GetIcon( LPWIN32_FIND_DATA pFd, BOOL bOpen /* = FALSE */,  BOOL bSmall /* = TRUE */  ) const
  95. {
  96. CString strName = pFd->cFileName;
  97. if (strName == "..")
  98. return 4;
  99.     SHFILEINFO sfi;
  100.     DWORD dwFlags = SHGFI_USEFILEATTRIBUTES|SHGFI_SYSICONINDEX;
  101.     
  102.     size_t size = sizeof( SHFILEINFO );
  103.     if( bSmall )
  104. dwFlags |= SHGFI_SMALLICON;
  105.     
  106.     if( bOpen )
  107. dwFlags |= SHGFI_OPENICON;
  108.     
  109.     SHGetFileInfo( pFd->cFileName, pFd->dwFileAttributes, &sfi, size, dwFlags );
  110.     
  111.     return( sfi.iIcon );
  112. }
  113. CImageList * CSystemImageList::GetImageList( BOOL bSmall /* = TRUE */ ) const 
  114. {
  115.     CImageList * pList = NULL;
  116.     
  117.     if( bSmall )
  118. pList = m_gpSmallImageList;
  119.     else
  120. pList = m_gpLargeImageList;
  121.     // Ought to return a const pointer here (so noone tries to delete
  122.     // the lists). However, SetImageList in the common controls requires
  123.     // a non-const pointer, so it wouldn't be much use to anyone.
  124.     return( pList ); 
  125. }