本文简单整理了初学者在学习MFC的Tab Control控件时的步骤,并附上在此过程中我遇到的一些问题,希望对你有所帮助。
1.1 建立一个MFC对话框应用程序,在对话框中拖入Tab Control控件:
1.2 在20220913Dlg.h头文件中声明一个CTabCtrl变量:
CTabCtrl m_tab;
变量m_tab用来与对话框中的Tab Control控件交互,因此需要在20220913Dlg.cpp源文件的DoDataExchange函数中加入DDX_Control语句:
DDX_Control(pDX, IDC_TAB1, m_tab);// IDC_TAB1是Tab Control控件的ID名
注意1:DoDataExchange函数是一种数据动态绑定技术;先在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按钮中,比如DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_CHECK1中。
注意2:当添加一个控件并保存后,才会在resouce.h中自动生成此控件的ID。需要注意此问题的原因是当添加了Tab Control后发现IDC_TAB1被标为未定义的标识符。
2.1 在资源视图的Dialog文件夹中插入两个对话框IDD_DIALOG1、IDD_DIALOG2,作为Tab Control控件切换的界面,将这两个对话框的Border属性设置为None,Style设置为Thin:
2.2为创建的两个对话框建立两个类CTestDialog1,CTestDialog2,添加类的方法:右击对话框界面,在弹出框中选择添加类;添加类后会在工程中自动添加这两个类的头文件和源文件。
3.1在Tab Control控件所在的对话框类的头文件(20220913Dlg.h)中添加以下内容并添加切换页面对话框的头文件:
public:
int m_CurSelTab;
CTestDialog1 m_page1;
CTestDialog2 m_page2;
CDialog* pDialog[2]; //用来保存对话框对象指针
注意3:生成解决方案时出现error C2146: 语法错误: 缺少“;”(在标识符“m_page1(m_page2)”的前面)问题导向:
类似于这种情况的,是文件相互包含导致,也有可能是没有包含需要的头文件
问题解决:
发现对话框类的头文件(20220913Dlg.h)中没有包含两个页面的头文件,添加
#include "TestDialog1.h"
#include "TestDialog2.h"
3.2在对话框类的初始化函数中需要把CTestDialog1、CTestDialog2和Tab Control关联起来,并保存页面地址,设置初始页面,在OnInitDialog()中添加以下实现代码:
//为Tab Control增加两个页面
m_tab.InsertItem(0, _T("扩展信息1"));
m_tab.InsertItem(1, _T("扩展信息2"));
//创建两个对话框
m_page1.Create(IDD_DIALOG1, &m_tab);
m_page2.Create(IDD_DIALOG2, &m_tab);
//设定在Tab内显示的范围
CRect rc;
m_tab.GetClientRect(rc);
rc.top += 20;
rc.bottom -= 0;
rc.left += 0;
rc.right -= 0;
m_page1.MoveWindow(&rc);
m_page2.MoveWindow(&rc);
//把对话框对象指针保存起来
pDialog[0] = &m_page1;
pDialog[1] = &m_page2;
//显示初始页面
pDialog[0]->ShowWindow(SW_SHOW);
pDialog[1]->ShowWindow(SW_HIDE);
//保存当前选择
m_CurSelTab = 0;
此处使用一个CDialog指针数组来进行保存Tab Control的每个页面,数组的大小是Tab Control页面的个数,数组下标对应着每个页面的索引(这样方便快速存取)。
3.3为Tab Control添加消息处理程序,双击Tab Control控件,自动进入消息处理程序代码并添加以下代码进行页面的切换:
void CTabControlTestDlg::OnTcnSelchangeTabTest(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
//把当前的页面隐藏起来
pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);
//得到新的页面索引
m_CurSelTab = m_tab.GetCurSel();
//把新的页面显示出来
pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);
*pResult = 0;
}
4、最终调试结果