Skip to content

Tab Control

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

image-20250627150222863

1.基本使用

本环节创建了一个主对话框:MFC_TABDlg,三个Tab对话框:Dlg1Dlg3Dlg3,以此作为示例

1.1 创建控件

在工具箱中选中Tab Control,添加进主对话框中

image-20250627150339380

为了操作方便,给这个Tab控件添加一个变量,右键控件=》添加变量,此处命名为m_tabCtrlimage-20250627150733268

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

运行可看到效果如下

image-20250627152231913

但此时点击标签页并没有效果,因为还没给tab添加对话框

1.3 创建Tab对话框

右键资源文件=》添加=》资源

image-20250627150842093

选择Dialog=》新建

image-20250627150922809

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

image-20250627151016658

重复刚才的步骤,多创建几个对话框

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

image-20250627151144826

本示例供创建了三个对话框,ID分别为IDD_DIALOG1IDD_DIALOG2IDD_DIALOG3

为了便于区分,现在不同对话框中添加一些内容

image-20250627151342227

1.4 修改Tab对话框属性

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

image-20250627151447533

image-20250627151457473

1.5 创建Tab对话框类

右键Tab对话框=》添加类=》输入类名=》勾选下面两个选项=》确定

其他两个对话框也是如此

本示例给三个Tab对话框分别取类名为:Dlg1Dlg2Dlg3

image-20250627151542516

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

image-20250627151704929

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切换事件,处理切换逻辑

image-20250627153013063

事件内容如下

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

MIT Licensed