#pragma once
#include <list>
// CTabCtrlEx
class CTabCtrlEx : public CTabCtrl
{
DECLARE_DYNAMIC(CTabCtrlEx)
public:
CTabCtrlEx();
virtual ~CTabCtrlEx();
public:
int currentIndex() { return this->GetCurSel(); }
void setCurrentIndex(int index);
int indexOf(CWnd * page) const;
CWnd* page(int index) const;
int addTab(CWnd* page, const CString & label);
void removeTab(int index);
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);
private:
struct tagPageItem
{
CWnd* page;
CString label;
};
std::list<tagPageItem> m_pageItemList;
};
// TabCtrlEx.cpp : 实现文件
//
#include "stdafx.h"
#include "TestSNK088A.h"
#include "TabCtrlEx.h"
// CTabCtrlEx
IMPLEMENT_DYNAMIC(CTabCtrlEx, CTabCtrl)
CTabCtrlEx::CTabCtrlEx()
{
}
CTabCtrlEx::~CTabCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
END_MESSAGE_MAP()
// CTabCtrlEx 消息处理程序
void CTabCtrlEx::setCurrentIndex(int index)
{
int i = 0;
std::list<tagPageItem>::const_iterator it = m_pageItemList.begin();
while (it != m_pageItemList.end())
{
if (i == index)
{
CRect rc;
this->GetClientRect(rc);
rc.DeflateRect(5,30,5,5);
it->page->MoveWindow(rc);
it->page->ShowWindow(SW_NORMAL);
}
else
{
it->page->ShowWindow(SW_HIDE);
}
++i;
++it;
}
SetCurSel(index);
}
int CTabCtrlEx::indexOf(CWnd * page) const
{
int i = 0;
std::list<tagPageItem>::const_iterator it = m_pageItemList.begin();
while (it != m_pageItemList.end())
{
if (page == it->page)
{
return i;
}
++i;
++it;
}
return -1;
}
CWnd* CTabCtrlEx::page(int index) const
{
int i = 0;
std::list<tagPageItem>::const_iterator it = m_pageItemList.begin();
while (it != m_pageItemList.end())
{
if (i == index)
{
return it->page;
}
++i;
++it;
}
return NULL;
}
int CTabCtrlEx::addTab(CWnd* page, const CString & label)
{
int index = indexOf(page);
if (index != -1)
return index;
tagPageItem item;
item.page = page;
item.label = label;
m_pageItemList.push_back(item);
InsertItem(GetItemCount(), label);
return (GetItemCount() - 1);
}
void CTabCtrlEx::removeTab(int index)
{
int i = 0;
std::list<tagPageItem>::const_iterator it = m_pageItemList.begin();
while (it != m_pageItemList.end())
{
if (i == index)
{
m_pageItemList.erase(it);
}
++i;
++it;
}
DeleteItem(index);
if (currentIndex() == index)
{
setCurrentIndex(0);
}
}
void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int curSel = GetCurSel();
setCurrentIndex(curSel);
}