- // HighColorTab.hpp
- //
- // Author: Yves Tkaczyk (yves@tkaczyk.net)
- //
- // This software is released into the public domain. You are free to use it
- // in any way you like BUT LEAVE THIS HEADER INTACT.
- //
- // This software is provided "as is" with no expressed or implied warranty.
- // I accept no liability for any damage or loss of business that this software
- // may cause.
- //
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _HIGHCOLORTAB_HPP_INCLUDED_
- #define _HIGHCOLORTAB_HPP_INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include <memory>
- namespace HighColorTab
- {
- /*! brief Policy class for creating image list.
- Policy for creating a high color (32 bits) image list. The policy
- ensure that there is a Win32 image list associated with the CImageList.
- If this is not the case, a NULL pointer shall be returned.
- Returned image list is wrapped in an std::auto_ptr.
- sa UpdateImageListFull */
- struct CHighColorListCreator
- {
- /*! Create the image list.
- retval std::auto_ptr<CImageList> Not null if success. */
- static std::auto_ptr<CImageList> CreateImageList()
- {
- std::auto_ptr<CImageList> apILNew( new CImageList() );
- if( NULL == apILNew.get() )
- {
- // ASSERT: The CImageList object creation failed.
- ASSERT( FALSE );
- return std::auto_ptr<CImageList>();
- }
- if( 0 == apILNew->Create( 16, 16, ILC_COLOR32|ILC_MASK, 0, 1 ) )
- {
- // ASSERT: The image list (Win32) creation failed.
- ASSERT( FALSE );
- return std::auto_ptr<CImageList>();
- }
- return apILNew;
- }
- };
- /*! brief Change the image list of the provided control (property sheet interface)
- This method provides full customization via policy over image list creation. The policy
- must have a method with the signature:
- <code>static std::auto_ptr<CImageList> CreateImageList()</code>
- author Yves Tkaczyk (yves@tkaczyk.net)
- date 02/2004 */
- template<typename TSheet,
- typename TListCreator>
- bool UpdateImageListFull(TSheet& rSheet)
- {
- // Get the tab control...
- CTabCtrl* pTab = rSheet.GetTabControl();
- if (!IsWindow(pTab->GetSafeHwnd()))
- {
- // ASSERT: Tab control could not be retrieved or it is not a valid window.
- ASSERT( FALSE );
- return false;
- }
- // Create the replacement image list via policy.
- std::auto_ptr<CImageList> apILNew( TListCreator::CreateImageList() );
- bool bSuccess = (NULL != apILNew.get() );
- // Reload the icons from the property pages.
- int nTotalPageCount = rSheet.GetPageCount();
- for(int nCurrentPage = 0; nCurrentPage < nTotalPageCount && bSuccess; ++nCurrentPage )
- {
- // Get the page.
- CPropertyPage* pPage = rSheet.GetPage( nCurrentPage );
- ASSERT( pPage );
- // Set the icon in the image list from the page properties.
- if( pPage && ( pPage->m_psp.dwFlags & PSP_USEHICON ) )
- {
- bSuccess &= ( -1 != apILNew->Add( pPage->m_psp.hIcon ) );
- }
- if( pPage && ( pPage->m_psp.dwFlags & PSP_USEICONID ) )
- {
- bSuccess &= ( -1 != apILNew->Add( AfxGetApp()->LoadIcon( pPage->m_psp.pszIcon ) ) );
- }
- }
- if( !bSuccess )
- {
- // This ASSERT because either the image list could not be created or icon insertion failed.
- ASSERT( FALSE );
- // Cleanup what we have in the new image list.
- if( apILNew.get() )
- {
- apILNew->DeleteImageList();
- }
- return false;
- }
- // Replace the image list from the tab control.
- CImageList* pilOld = pTab->SetImageList( CImageList::FromHandle( apILNew->Detach() ) );
- // Clean the old image list if there was one.
- if( pilOld )
- {
- pilOld->DeleteImageList();
- }
- return true;
- };
- /*! brief Change the image list of the provided control (property sheet)
- This method uses 32 bits image list creation default policy. */
- template<typename TSheet>
- bool UpdateImageList(TSheet& rSheet)
- {
- return UpdateImageListFull<TSheet, HighColorTab::CHighColorListCreator>( rSheet );
- };
- };
- #endif // _HIGHCOLORTAB_HPP_INCLUDED_