📄 xtabframe.cpp
字号:
// XTabFrame.cpp : implementation of the CTabFrame class
////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "XTabFrame.h"
////////////////////////////////////////////////////////////////////
// CTabFrame
CTabFrame::CTabFrame()
{
// 任意选择
m_nCurTab = 0;
m_nTabCount = 0;
m_bShowBorder = TRUE;
m_bStepWizard = FALSE;
}
CTabFrame::~CTabFrame()
{
for(long i = 0; i < m_nTabCount; i ++)
{
if( m_bRelease[i] )
{
m_lpPage[i]->DestroyWindow();
delete m_lpPage[i];
}
}
}
BEGIN_MESSAGE_MAP(CTabFrame, CTabCtrl)
//{{AFX_MSG_MAP(CTabFrame)
ON_WM_SIZE()
ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnTabChange)
ON_NOTIFY_REFLECT(TCN_SELCHANGING, OnTabChanging)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////
// CTabFrame message handlers
void CTabFrame::SetBorderVisible(BOOL bShowBorder)
{
m_bShowBorder = bShowBorder;
}
BOOL CTabFrame::Create(CWnd * lpParent,
DWORD dwStyle, RECT& rect, UINT nWndID)
{
// 创建窗口
if( !CTabCtrl::Create(dwStyle, rect,
lpParent, nWndID) )
return FALSE;
return TRUE;
}
// 获取Tab标题
long CTabFrame::GetTabText(long nItem, LPTSTR lpBuffer, long nBuffer)
{
TCHAR lpTemp[65];
if(lpBuffer == NULL)
{
lpBuffer = lpTemp;
nBuffer = 64;
}
TCITEM myItem;
myItem.mask = TCIF_TEXT;
myItem.pszText = lpBuffer;
myItem.cchTextMax = nBuffer;
if( !GetItem(nItem, &myItem) )
return -1;
return lstrlen(lpBuffer);
}
void CTabFrame::SetTabText(long nItem, LPCTSTR lpString)
{
TCITEM myItem;
myItem.mask = TCIF_TEXT;
myItem.pszText = (LPSTR)lpString;
myItem.cchTextMax = 1024;
SetItem(nItem, &myItem);
}
CWnd * CTabFrame::GetPage(long nPage)
{
ASSERT(nPage >= 0);
ASSERT(nPage < m_nTabCount);
return m_lpPage[nPage];
}
CWnd * CTabFrame::GetCurPage()
{
ASSERT(m_nTabCount > 0);
return m_lpPage[m_nCurTab];
}
void CTabFrame::SetCurPage(long nPage)
{
ASSERT(nPage >= 0 && nPage < m_nTabCount);
SetCurSel(nPage);
m_nCurTab = nPage;
}
long CTabFrame::GetCurTab()
{
ASSERT(m_nTabCount > 0);
return m_nCurTab;
}
long CTabFrame::GetTabCount()
{
return m_nTabCount;
}
void CTabFrame::AddPage(LPCTSTR lpCaption,
CWnd * lpPage, BOOL bRelease)
{
// 添加一个页面
InsertItem(m_nTabCount, lpCaption, 0);
m_bRelease[m_nTabCount] = bRelease;
m_lpPage[m_nTabCount ++] = lpPage;
// 移动到正确的位置
RECT rtRect;
GetViewRect(&rtRect);
lpPage->MoveWindow(&rtRect);
// 如果是第一页显示
if(m_nTabCount == 1)
lpPage->ShowWindow(SW_SHOW);
else
lpPage->ShowWindow(SW_HIDE);
}
CWnd * CTabFrame::DropPage(long nPage)
{
ASSERT(nPage >= 0);
ASSERT(nPage < m_nTabCount);
// 备份当前页面
CWnd * lpPage = m_lpPage[nPage];
// 删除需要删除的页
DeleteItem(nPage);
m_nTabCount --;
for(long i = nPage; i < m_nTabCount; i ++)
{
m_bRelease[i] = m_bRelease[i + 1];
m_lpPage[i] = m_lpPage[i + 1];
}
return lpPage;
}
void CTabFrame::OnTabChanging(NMHDR* lpHdr, LRESULT* lpResult)
{
// 向导式页面,不换页
*lpResult = m_bStepWizard;
}
void CTabFrame::StartWizard()
{
SetCurSel(0);
m_bStepWizard = TRUE;
OnTabChange(NULL, NULL);
}
BOOL CTabFrame::GoNextWizard()
{
if(m_nCurTab + 1 < m_nTabCount)
{
SetCurSel(m_nCurTab + 1);
OnTabChange(NULL, NULL);
return TRUE;
}
return FALSE;
}
BOOL CTabFrame::GoPrevWizard()
{
if(m_nCurTab > 0)
{
SetCurSel(m_nCurTab - 1);
OnTabChange(NULL, NULL);
return TRUE;
}
return FALSE;
}
void CTabFrame::StopWizard()
{
m_bStepWizard = FALSE;
}
void CTabFrame::GetViewRect(LPRECT lpRect)
{
// Tab Item Height
RECT rcItem;
GetItemRect(0, &rcItem);
// Tab Window Rect
GetClientRect(lpRect);
if(GetStyle() & TCS_BOTTOM)
{
lpRect->bottom = rcItem.top - 1;
if( m_bShowBorder )
{
lpRect->top += 3;
lpRect->left += 3;
lpRect->right -= 3;
}
}
else
{
lpRect->top = rcItem.bottom + 1;
if( m_bShowBorder )
{
lpRect->left += 3;
lpRect->right -= 3;
lpRect->bottom -= 3;
}
}
}
void CTabFrame::OnSize(UINT nType, int cx, int cy)
{
CTabCtrl::OnSize(nType, cx, cy);
RECT rtRect;
GetViewRect(&rtRect);
// 将页面调整到新的位置
for(long i = 0; i < m_nTabCount; i ++)
m_lpPage[i]->MoveWindow(&rtRect);
}
void CTabFrame::OnTabChange(NMHDR* lpHdr, LRESULT* lpResult)
{
// 当前的选项
long nIndex = GetCurSel();
if(nIndex < 0) return;
// 显示新的页面
m_lpPage[nIndex]->ShowWindow(SW_SHOW);
// 隐藏以前页面
if(nIndex != m_nCurTab)
{
m_lpPage[m_nCurTab]->ShowWindow(SW_HIDE);
m_nCurTab = nIndex;
}
// 页面改变了
HWND hParent;
hParent = ::GetParent(m_hWnd);
::SendMessage(hParent, WM_TABCHANGE, (UINT)m_hWnd, nIndex);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -