📄 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
#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_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -