MFC 中Tab Control的简单使用

本文详细介绍了如何使用TabControl组件创建带有多个子页面的对话框。主要内容包括:创建TabControl对话框及子对话框、设置TabPage属性、调整子对话框位置、实现TabPage切换等功能。

tab control的使用

1、首先为要放置tab control的对话框新建一个类(CTab),在一个对话框中放置一个tab control,为这个控件添加个变量(m_tab)
2、再新建两个(也可多个,但是比较麻烦,这里就省略了)对话框,把新建的这两个对话框的属性style的值修改为“child”,属性Border的值修改为“none”。
3、分别在新建的对话框中放置一些控件(当然是你需要的控件,你应该会使用这些控件)。
4、分别为新建的对话框建立两个类,名称可为CPara1,CPara2(当然可以是你随便起的名字);然后在放置tab control对话框的类头文件中声明新建对话框类的对象,CPara1 page1;CPara2 page2;
5、在CTab类的cpp文件中的OnInitDialog函数中添加初始化Tab Control的代码(如果没有OnInitDialog函数,要添加上),我写的实验程序中的代码如下
 (1)下面的时为tab设置两个属性页,只是起个名字
 m_tab.InsertItem(0, _T("1号属性页"));
 m_tab.InsertItem(1, _T("2号属性页"));
 (2)然后关联属性页与对话框
 m_page1.Create(IDD_DIALOG1, &m_tab);
 m_page2.Create(IDD_DIALOG2, &m_tab);
 (3)设置对话框在属性页上的位置
 //设定在Tab内显示的范围
 CRect rc;
 m_tab.GetClientRect(&rc);
 rc.top += 20;
 //rc.bottom -= 60;
 //rc.left += 10;
 //rc.right -= 28;

 m_page1.MoveWindow(&rc);
 m_page2.MoveWindow(&rc);

 //把对话框对象指针保存起来
 m_page1.ShowWindow(true);
 m_page2.ShowWindow(false);

 m_tab.SetCurSel(0);
6、为tab control 添加TCN_SELCHANGE事件,在其中添加如下代码
 int CurSel = m_tab.GetCurSel();
 switch(CurSel)
 {
 case 0:
  m_page1.ShowWindow(true);
  m_page2.ShowWindow(false);
  break;
 case 1:
  m_page1.ShowWindow(false);
  m_page2.ShowWindow(true);
  break;
 default:
  ;
 }   
7、你也可以为你新建的对话框中控件添加初始化函数,具体的就是在类的OnInitDialog函数中添加就可以了,其它控件的初始化在这里就不谈了。
以前试了几次,今天终于静下心来初步的搞定了,在这里给大家分享下,中间肯定有不妥之处,敬请各位大侠指教!

http://blog.youkuaiyun.com/sciland/archive/2010/05/20/5610680.aspx

<think> 我们被要求回答关于MFCTab Control使用方法。根据提供的引用,我们可以总结出以下步骤: 1. 在对话框中添加Tab Control控件,并为其绑定一个变量(如m_tab)。 2. 在DoDataExchange函数中使用DDX_Control控件与变量绑定。 3. 创建多个对话框作为Tab的页面,并设置这些对话框的属性(注意要去除边框和标题栏,并将Style设置为Child)。 4. 在父对话框的初始化函数(如OnInitDialog)中,向Tab Control添加标签页(使用InsertItem),并创建和显示页面对话框。 5. 调整页面对话框的位置和大小,使其适应Tab Control的客户区。 6. 为Tab Control添加选择改变事件(TCN_SELCHANGE)的处理函数,在该函数中根据当前选中的标签页显示对应的对话框页面,隐藏其他页面。 我们将按照这些步骤详细说明。 </think> 在MFC使用Tab Control控件实现多页面切换的方法如下,我将逐步说明实现过程: ### 一、基本实现步骤 1. **添加控件并绑定变量** - 在对话框资源中添加Tab Control控件(ID如`IDC_TAB1`) - 在对话框类头文件中声明变量: ```cpp CTabCtrl m_tab; ``` - 在`DoDataExchange`函数中绑定控件: ```cpp DDX_Control(pDX, IDC_TAB1, m_tab); // IDC_TAB1是Tab控件ID[^2] ``` 2. **创建子对话框** - 为每个标签页创建对话框资源(如`IDD_PAGE1`、`IDD_PAGE2`) - 设置对话框属性: - Border: None - Style: Child - Title bar: False - 为每个对话框创建类(如`CPage1`、`CPage2`),继承自`CDialogEx` 3. **初始化标签页** ```cpp BOOL CYourDlg::OnInitDialog() { // 添加标签页 m_tab.InsertItem(0, _T("页面1")); m_tab.InsertItem(1, _T("页面2")); // 创建子对话框 page1.Create(IDD_PAGE1, &m_tab); page2.Create(IDD_PAGE2, &m_tab); // 设置初始显示位置 CRect rect; m_tab.GetClientRect(&rect); rect.DeflateRect(2, 30, 2, 2); // 调整边距 page1.MoveWindow(&rect); page2.MoveWindow(&rect); // 显示初始页面 page1.ShowWindow(SW_SHOW); page2.ShowWindow(SW_HIDE); return TRUE; } ``` 4. **处理标签切换事件** ```cpp void CYourDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult) { CRect rect; m_tab.GetClientRect(&rect); rect.DeflateRect(1, 25, 1, 1); // 调整标签页内容区位置[^3] switch (m_tab.GetCurSel()) { case 0: page1.MoveWindow(&rect); page1.ShowWindow(SW_SHOW); page2.ShowWindow(SW_HIDE); break; case 1: page2.MoveWindow(&rect); page1.ShowWindow(SW_HIDE); page2.ShowWindow(SW_SHOW); break; } *pResult = 0; } ``` ### 二、关键要点 1. **位置调整技巧**: - 使用`GetClientRect()`获取控件区域 - 通过`DeflateRect()`或`InflateRect()`调整内边距 - 标签头高度通常预留25-30像素 2. **内存管理**: ```cpp // 头文件中声明 CPage1 page1; CPage2 page2; // 析构函数中销毁 CYourDlg::~CYourDlg() { if(page1.GetSafeHwnd()) page1.DestroyWindow(); if(page2.GetSafeHwnd()) page2.DestroyWindow(); } ``` ### 三、动态创建优化 对于大量标签页,建议动态创建: ```cpp // 创建页面 void CYourDlg::CreatePage(int nIndex) { CRect rect; m_tab.GetClientRect(&rect); rect.DeflateRect(1, 25, 1, 1); if(!m_pPages[nIndex]->GetSafeHwnd()) { m_pPages[nIndex]->Create(m_pageIDs[nIndex], &m_tab); m_pPages[nIndex]->MoveWindow(&rect); } } ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值