TabCtrl重载

#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);
}


猜你喜欢

转载自blog.csdn.net/tajon1226/article/details/80189736