【MFC】Tab Control控件使用

本文简单整理了初学者在学习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、最终调试结果

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值