www.pudn.com > TreePropSheetEx.rar > HighColorTab.hpp
// 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 #includenamespace 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 Not null if success. */ static std::auto_ptr CreateImageList() { std::auto_ptr apILNew( new CImageList() ); if( NULL == apILNew.get() ) { // ASSERT: The CImageList object creation failed. ASSERT( FALSE ); return std::auto_ptr (); } 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 (); } 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: static std::auto_ptr\author Yves Tkaczyk (yves@tkaczyk.net) \date 02/2004 */ templateCreateImageList() 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 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 bool UpdateImageList(TSheet& rSheet) { return UpdateImageListFull ( rSheet ); }; }; #endif // _HIGHCOLORTAB_HPP_INCLUDED_