HighColorTab.hpp
上传用户:ahlaser
上传日期:2020-09-06
资源大小:116k
文件大小:4k
源码类别:

Static控件

开发平台:

Visual C++

  1. // HighColorTab.hpp
  2. //
  3. // Author:  Yves Tkaczyk (yves@tkaczyk.net)
  4. //
  5. // This software is released into the public domain.  You are free to use it 
  6. // in any way you like BUT LEAVE THIS HEADER INTACT.
  7. //
  8. // This software is provided "as is" with no expressed or implied warranty.  
  9. // I accept no liability for any damage or loss of business that this software 
  10. // may cause.
  11. //
  12. ///////////////////////////////////////////////////////////////////////////////
  13. #ifndef _HIGHCOLORTAB_HPP_INCLUDED_
  14. #define _HIGHCOLORTAB_HPP_INCLUDED_
  15. #if _MSC_VER > 1000
  16. #pragma once
  17. #endif // _MSC_VER > 1000
  18. #include <memory>
  19. namespace HighColorTab
  20. {
  21.   /*! brief Policy class for creating image list. 
  22.     Policy for creating a high color (32 bits) image list. The policy 
  23.     ensure that there is a Win32 image list associated with the CImageList.
  24.     If this is not the case, a NULL pointer shall be returned. 
  25.     Returned image list is wrapped in an std::auto_ptr.
  26.     
  27.     sa UpdateImageListFull  */
  28.   struct CHighColorListCreator
  29.   {
  30.     /*! Create the image list.
  31.         retval std::auto_ptr<CImageList> Not null if success. */
  32.     static std::auto_ptr<CImageList> CreateImageList()
  33.     {
  34.       std::auto_ptr<CImageList> apILNew( new CImageList() );
  35.       if( NULL == apILNew.get() )
  36.       {
  37.         // ASSERT: The CImageList object creation failed.
  38.         ASSERT( FALSE );
  39.         return std::auto_ptr<CImageList>();
  40.       }
  41.       if( 0 == apILNew->Create( 16, 16, ILC_COLOR32|ILC_MASK, 0, 1 ) )
  42.       {
  43.         // ASSERT: The image list (Win32) creation failed.
  44.         ASSERT( FALSE );
  45.         return std::auto_ptr<CImageList>();
  46.       }
  47.       return apILNew;
  48.     }
  49.   };
  50.   /*! brief Change the image list of the provided control (property sheet interface)
  51.     This method provides full customization via policy over image list creation. The policy
  52.     must have a method with the signature:
  53.     <code>static std::auto_ptr<CImageList> CreateImageList()</code>
  54.     author Yves Tkaczyk (yves@tkaczyk.net)
  55.     date 02/2004 */
  56.   template<typename TSheet,
  57.            typename TListCreator>
  58.     bool UpdateImageListFull(TSheet& rSheet)
  59.   {
  60.   // Get the tab control...
  61.   CTabCtrl* pTab = rSheet.GetTabControl();
  62.   if (!IsWindow(pTab->GetSafeHwnd()))
  63.   {
  64.       // ASSERT: Tab control could not be retrieved or it is not a valid window.
  65.       ASSERT( FALSE );
  66.   return false;
  67.   }
  68.     // Create the replacement image list via policy.
  69.     std::auto_ptr<CImageList> apILNew( TListCreator::CreateImageList() );
  70.     bool bSuccess = (NULL != apILNew.get() );
  71.     // Reload the icons from the property pages.
  72.     int nTotalPageCount = rSheet.GetPageCount();
  73.     for(int nCurrentPage = 0; nCurrentPage < nTotalPageCount && bSuccess; ++nCurrentPage )
  74.     {
  75.       // Get the page.
  76.       CPropertyPage* pPage = rSheet.GetPage( nCurrentPage );
  77.       ASSERT( pPage );
  78.       // Set the icon in the image list from the page properties.
  79.       if( pPage && ( pPage->m_psp.dwFlags & PSP_USEHICON ) )
  80.       {
  81.         bSuccess &= ( -1 != apILNew->Add( pPage->m_psp.hIcon ) );
  82.       }
  83.       if( pPage && ( pPage->m_psp.dwFlags & PSP_USEICONID ) )
  84.       {
  85.         bSuccess &= ( -1 != apILNew->Add( AfxGetApp()->LoadIcon( pPage->m_psp.pszIcon ) ) );
  86.       }
  87.     }
  88.     if( !bSuccess )
  89.     {
  90.       // This ASSERT because either the image list could not be created or icon insertion failed.
  91.       ASSERT( FALSE );
  92.       // Cleanup what we have in the new image list.
  93.       if( apILNew.get() )
  94.       {
  95.         apILNew->DeleteImageList();
  96.       }
  97.       return false;
  98.     }
  99.     // Replace the image list from the tab control.
  100.     CImageList* pilOld = pTab->SetImageList( CImageList::FromHandle( apILNew->Detach() ) );
  101.     // Clean the old image list if there was one.
  102.     if( pilOld )
  103.     {
  104.       pilOld->DeleteImageList();
  105.     }
  106.        
  107.     return true;
  108.   };
  109.   /*! brief Change the image list of the provided control (property sheet)
  110.     This method uses 32 bits image list creation default policy. */
  111.   template<typename TSheet>
  112.     bool UpdateImageList(TSheet& rSheet)
  113.   {
  114.     return UpdateImageListFull<TSheet, HighColorTab::CHighColorListCreator>( rSheet );
  115.   };
  116. };
  117. #endif // _HIGHCOLORTAB_HPP_INCLUDED_