#include "stdafx.h"
#include "TabSheet.h"
IMPLEMENT_DYNAMIC(CTabSheet, CTabCtrl)
CTabSheet::CTabSheet()
{
m_PageNum = 0;
m_nCurrentPage = 0;
}
CTabSheet::~CTabSheet()
{
}
BEGIN_MESSAGE_MAP(CTabSheet,CTabCtrl)
ON_NOTIFY_REFLECT(TCN_SELCHANGE,OnTcnSelchange) //OnTcnSelchange消息
END_MESSAGE_MAP()
BOOL CTabSheet::AddPage(CString szTitle, CDialog * pDialog, UINT ID ,bool ShowFirst)
{
if (MAX_PAGES == m_PageNum){
return FALSE; //如果超过最大页面数返回
}
m_PageNum++;//页面数加一
pages page;
page.m_pages = pDialog;
page.m_IDD = ID;
page.m_title = szTitle;
m_TabPages.push_back(page);//压入容器
int m_sel = GetCurSel();//如果成功返回从零开始所选择的选项卡的索引或如果是-1表示没有选项卡被选中
m_TabPages.at(m_PageNum-1).m_pages->Create(m_TabPages.at(m_PageNum-1).m_IDD,this);//创建子页面
InsertItem(m_PageNum-1,m_TabPages.at(m_PageNum-1).m_title);//插入一个tab页面
SetRect(m_PageNum-1);//设置子页面到tab
if (!ShowFirst) //让第一个tab页面获得焦点
SetCurFocus(m_PageNum-1);
else
if (m_sel != -1)
SetCurSel(m_sel);
// RedrawWindow(); //窗口重画
return TRUE;
}
BOOL CTabSheet::DeletePage(CString szTitle)//tab页面标题删除
{
for (UINT i = 0;i <m_TabPages.size() ;i++) //循环容器内部
{
if (m_TabPages.at(i).m_title = szTitle)//找到容器内窗口
{
if (DeleteItem(i))//删除页面
{
m_PageNum--; //页面数减一
delete(m_TabPages.at(i).m_pages);//删除窗体内存(堆空间)
m_TabPages.erase(m_TabPages.begin() + i);//删除容器内数据
// RedrawWindow();
return true;
}
else
return false;
}
}
return false;
}
BOOL CTabSheet::DeletePage(UINT site)//页面序号删除
{
if (m_TabPages.size() !=0 || site < m_TabPages.size())
{
m_PageNum--;
delete(m_TabPages.at(site).m_pages);
m_TabPages.erase(m_TabPages.begin() + site);
// RedrawWindow();
return TRUE;
}
return false;
}
void CTabSheet::SetRect(UINT nIdx)
{
/*
lpRect:是一个指针,指向一个RECT类型的rectangle结构。
该结构有四个LONG字段,分别为left、top、right和bottom。
GetClientRect将这四个字段设定为窗口显示区域的尺寸。
left和top字段通常设定为0。right和bottom字段设定为显示区域的宽度和高度(像素点数)。
也可以是一个CRect对象指针。CRect对象有多个参数,与RECT用法相同。
*/
CRect tabRect, itemRect;
int nX = 0, nY = 0, nXc = 0, nYc = 0;
UINT nCount = 0;
GetClientRect(&tabRect);
GetItemRect(0,&itemRect);
nX = itemRect.left;
nY = itemRect.bottom + 1;
nXc = tabRect.right - itemRect.left - 2;
nYc = tabRect.bottom - nY - 2;
if ( GetCurSel() == (m_PageNum - 1) ) //只把第一个窗口激活显示,其它全部隐藏。
{
m_TabPages.at(m_TabPages.size()-1).m_pages->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);
}
else
{
m_TabPages.at(m_TabPages.size()-1).m_pages->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
}
}
void CTabSheet::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
if (m_nCurrentPage != GetCurFocus())//如果当前选中不是第一个页面
{
m_TabPages.at(m_nCurrentPage).m_pages->ShowWindow(SW_HIDE);//把上一个显示界面页面隐藏
m_nCurrentPage = GetCurFocus();//获取当前选中的页面
m_TabPages.at(m_nCurrentPage).m_pages->ShowWindow(SW_SHOW);//把当前选中的页面显示出来
}
*pResult = 0;
}