Tab Control
Tab Control可以控制多个页面的显示与隐藏

1.基本使用
本环节创建了一个主对话框:MFC_TABDlg,三个Tab对话框:Dlg1,Dlg3,Dlg3,以此作为示例
1.1 创建控件
在工具箱中选中Tab Control,添加进主对话框中

为了操作方便,给这个Tab控件添加一个变量,右键控件=》添加变量,此处命名为m_tabCtrl
1.2 添加Tab标签
在主对话框的源文件的OnInitDialog()中,添加如下内容
c++
BOOL CMFCTABDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 省略默认生成内容
m_tabCtrl.InsertItem(0, _T("aaaa"));
m_tabCtrl.InsertItem(1, _T("bbb"));
m_tabCtrl.InsertItem(2, _T("ccc"));
return FALSE;
}运行可看到效果如下

但此时点击标签页并没有效果,因为还没给tab添加对话框
1.3 创建Tab对话框
右键资源文件=》添加=》资源

选择Dialog=》新建

点击资源视口,打开Dialog即可看到刚才创建的对话框,在属性栏中可以修改该对话框的ID

重复刚才的步骤,多创建几个对话框
但也有简单方式:右键刚才的对话框=》点击插入,即可再创建一个对话框

本示例供创建了三个对话框,ID分别为IDD_DIALOG1、IDD_DIALOG2、IDD_DIALOG3
为了便于区分,现在不同对话框中添加一些内容

1.4 修改Tab对话框属性
重要:需要给刚才创建的三个对话框的边框设置为None,样式设置为Child


1.5 创建Tab对话框类
右键Tab对话框=》添加类=》输入类名=》勾选下面两个选项=》确定
其他两个对话框也是如此
本示例给三个Tab对话框分别取类名为:Dlg1、Dlg2、Dlg3

添加好之后可以在资源管理器中看到相应的头文件和源文件

1.6 创建关联
接下来要将Tab Control与这三个Tab对话框创建关联
先在主对话框头文件中(MFC_TABDlg.h)引入刚才三个对话框的头文件,然后创建分别为这三个对话框创建变量
然后在MFC_TABDlg.cpp中的OnInitDialog()中添加如下内容
c++
#pragma once
#include "Dlg1.h"
#include "Dlg2.h"
#include "Dlg3.h"
class CMFCTABDlg : public CDialogEx
{
public:
CMFCTABDlg(CWnd* pParent = nullptr); // 标准构造函数
public:
CTabCtrl m_tabCtrl;
Dlg1 *dlg1;
Dlg2 *dlg2;
Dlg3 *dlg3;
afx_msg void OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
};c++
BOOL CMFCTABDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 省略默认生成的内容
// 创建标签
m_tabCtrl.InsertItem(0, _T("aaaa"));
m_tabCtrl.InsertItem(1, _T("bbb"));
m_tabCtrl.InsertItem(2, _T("ccc"));
// 使Tab Control占满主对话框
CRect rect;
GetClientRect(rect);
m_tabCtrl.MoveWindow(rect);
// 实例化Tab对话框
dlg1 = new Dlg1();
dlg2 = new Dlg2();
dlg3 = new Dlg3();
// 创建对话框控件,并与Tab Control的变量创建关联
dlg1->Create(IDD_DIALOG1,&m_tabCtrl);
dlg2->Create(IDD_DIALOG2,&m_tabCtrl);
dlg3->Create(IDD_DIALOG3,&m_tabCtrl);
m_tabCtrl.AdjustRect(FALSE, rect); // FALSE 时在传入的矩形上剪切掉标签页区域
// 使tab对话框占满tab control
dlg1->MoveWindow(rect);
dlg2->MoveWindow(rect);
dlg3->MoveWindow(rect);
m_tabCtrl.SetCurSel(0);
// 显示第一个对话框,重点
dlg1->ShowWindow(SW_SHOW);
return FALSE;
}1.7 添加切换事件
在属性栏中给Tab control添加Tab切换事件,处理切换逻辑

事件内容如下
c++
void CMFCTABDlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// 获取当前切换页
int mSel = m_tabCtrl.GetCurSel();
switch (mSel) {
case 0:
dlg1->ShowWindow(SW_SHOW);
dlg2->ShowWindow(SW_HIDE);
dlg3->ShowWindow(SW_HIDE);
break;
case 1:
dlg1->ShowWindow(SW_HIDE);
dlg2->ShowWindow(SW_SHOW);
dlg3->ShowWindow(SW_HIDE);
break;
case 2:
dlg1->ShowWindow(SW_HIDE);
dlg2->ShowWindow(SW_HIDE);
dlg3->ShowWindow(SW_SHOW);
break;
default:
break;
}
*pResult = 0;
}