www.pudn.com > STabCtrl.rar > STabCtrl.cpp


// STabCtrl.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "STabCtrl.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
CSTabCtrl::CSTabPage::CSTabPage() 
{ 
 
} 
 
CSTabCtrl::CSTabPage::~CSTabPage() 
{ 
	m_ControlList.RemoveAll(); 
} 
 
BOOL CSTabCtrl::CSTabPage::AttachControl (CWnd * _pControl) 
{ 
	return (BOOL) m_ControlList.AddTail (_pControl); 
} 
 
BOOL CSTabCtrl::CSTabPage::ShowWindows ( INT _nCmdShow ) 
{ 
	POSITION _rPos = m_ControlList.GetHeadPosition(); 
	CWnd * _pCtrl = NULL; 
 
	while(_rPos) 
	{ 
		_pCtrl = m_ControlList.GetNext(_rPos); 
 
		::ShowWindow(_pCtrl -> GetSafeHwnd(), _nCmdShow ); 
 
		// cannot use because using this call with the MS WebBrowser 
		// control destroys the control's window. 
		//_pCtrl -> ShowWindow(_nCurrSel == _rKey); 
	} 
 
	return TRUE; 
} 
 
BOOL CSTabCtrl::CSTabPage::EnableWindows ( BOOL _bEnable ) 
{ 
	POSITION _rPos = m_ControlList.GetHeadPosition(); 
	CWnd * _pCtrl = NULL; 
 
	while(_rPos) 
	{ 
		_pCtrl = m_ControlList.GetNext(_rPos); 
 
		::EnableWindow(_pCtrl -> GetSafeHwnd(), _bEnable ); 
	} 
 
	return TRUE; 
} 
 
CSTabCtrl::CPageToControlsMap::CPageToControlsMap( ) 
{ 
 
} 
 
CSTabCtrl::CPageToControlsMap::~CPageToControlsMap( ) 
{ 
	CPageToControlsMap::RemoveAll(); 
} 
 
 
BOOL CSTabCtrl::CPageToControlsMap::AttachControl(INT _nTabNum,CWnd * _pControl) 
{ 
	CSTabPage * _pTabPage = NULL; 
 
	if(!Lookup(_nTabNum,_pTabPage) || !_pTabPage) 
	{ 
		_pTabPage = new CSTabPage(); 
		SetAt(_nTabNum, _pTabPage); 
	} 
 
	if(_pTabPage -> AttachControl(_pControl)) 
	{ 
		// make sure control is hidden... 
		::ShowWindow( _pControl -> GetSafeHwnd(), SW_HIDE ); 
 
		return TRUE; 
	} 
	else 
	{ 
		return FALSE; 
	} 
} 
 
BOOL CSTabCtrl::CPageToControlsMap::EnableWindows ( INT _nCurrPage, BOOL _bEnable ) 
{ 
	CList  * _pCtrlList = NULL; 
	CSTabPage * _pTabPage = NULL; 
 
	if(Lookup(_nCurrPage,_pTabPage) && _pTabPage) 
	{ 
		return _pTabPage -> EnableWindows ( _bEnable ); 
	} 
	else 
	{ 
		return FALSE; 
	} 
} 
 
BOOL CSTabCtrl::CPageToControlsMap::ShowWindows ( INT _nCurrPage, INT _nCmdShow ) 
{ 
	CList  * _pCtrlList = NULL; 
	CSTabPage * _pTabPage = NULL; 
 
	if(Lookup(_nCurrPage,_pTabPage) && _pTabPage) 
	{ 
		return _pTabPage -> ShowWindows ( _nCmdShow ); 
	} 
	else 
	{ 
		return FALSE; 
	} 
} 
 
void CSTabCtrl::CPageToControlsMap::RemoveAll( ) 
{ 
	POSITION _rPos = GetStartPosition(); 
	CSTabPage * _pValue = NULL; 
	INT _rKey; 
 
	while(_rPos) 
	{ 
		GetNextAssoc(_rPos,_rKey,_pValue); 
		delete _pValue; 
	} 
 
	CMap ::RemoveAll(); 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CSTabCtrl 
 
CSTabCtrl::CSTabCtrl() 
{ 
	m_nPrevSel = -1; 
} 
 
CSTabCtrl::~CSTabCtrl() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CSTabCtrl, CTabCtrl) 
	//{{AFX_MSG_MAP(CSTabCtrl) 
	ON_NOTIFY_REFLECT_EX(TCN_SELCHANGE, OnSelchange) 
	ON_WM_DESTROY() 
	ON_WM_CREATE() 
	ON_WM_ENABLE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSTabCtrl message handlers 
 
int CSTabCtrl::SetCurSel( int nItem ) 
{ 
	int _nRetVal = CTabCtrl::SetCurSel(nItem); 
 
	NMHDR _nDummyNMHDR; 
	LRESULT _nDummyLRESULT; 
 
	OnSelchange(&_nDummyNMHDR,&_nDummyLRESULT); 
 
	return _nRetVal; 
} 
 
BOOL CSTabCtrl::AttachControlToTab(CWnd * _pControl, 
									INT _nTabNum) 
{ 
	if(_nTabNum >= GetItemCount()) 
	{ 
		ASSERT(FALSE); 
		return FALSE; 
	} 
 
	m_TabPagesMap.AttachControl (_nTabNum,_pControl); 
 
	return TRUE; 
} 
 
void CSTabCtrl::OnEnable( BOOL bEnable ) 
{ 
 
	CTabCtrl::OnEnable(bEnable); 
	 
	INT _nTabPageCount (GetItemCount()); 
 
	for(INT i = 0; i < _nTabPageCount; i ++) 
	{ 
		m_TabPagesMap.EnableWindows (i, bEnable); 
	} 
} 
 
BOOL CSTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	INT _nCurrSel = GetCurSel(); 
 
	// hide Previous pages controls... 
	m_TabPagesMap.ShowWindows (m_nPrevSel, SW_HIDE); 
	 
	// show current pages controls. 
	m_TabPagesMap.ShowWindows (_nCurrSel, SW_SHOW); 
 
	m_nPrevSel = _nCurrSel; 
 
	*pResult = 0; 
 
	return FALSE;	// allow control to handle as well. 
} 
 
int CSTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	m_nPrevSel = -1; 
	return 0; 
} 
 
void CSTabCtrl::OnDestroy()  
{ 
	CTabCtrl::OnDestroy(); 
	 
	// clean up map. 
	m_TabPagesMap.RemoveAll(); 
}