参考
正文
-
创建一个基于对话框的MFC工程,名称设置为Test_TabControl。
-
资源视图—>右键Dialog,插入两个需要在Tab Control控件上显示的子对话框,IDD_DIALOG1、IDD_DIALOG2。
-
在主对话框或是两个子对话框中,空白处右键—>添加类,若选择了类向导,则在弹出的类向导中需将默认的基类从CWnd改为CDialogEx。然后添加两个子对话框IDD_DIALOG1、IDD_DIALOG2对应的类,假设类名为CDIALOG1、CDIALOG2。
-
将在资源视图下增加的两个对话框的属性进行修改。分别切换到IDD_DIALOG1、IDD_DIALOG2对话框界面,在属性栏中的外观栏下,将Border改为None,Style改为child。
-
在主对话框Test_TabControlDlg.h中包含上述两个对话框的头文件,这里也即包含“JzmDlg.h”和“AndroidDlg.h”两个头文件
#include "AndroidDlg.h"
#include "JzmDlg.h"
然后继续在“Test_TabControlDlg.h”文件中为CTest_TabControlDlg类添加两个成员变量: CJzmDlg m_jzmDlg和 CAndroidDlg m_androidDlg;
CJzmDlg m_jzmDlg;
CAndroidDlg m_androidDlg;
- 在CTest_TabControlDlg对话框初始化时,我们也初始化标签控件。修改CTest_TabControlDlg::OnInitDialog()函数如下:
在注释 :
// TODO: 在此添加额外的初始化代码
之后添加如下的代码:
CRect tabRect; // 标签控件客户区的位置和大小
m_tab.InsertItem(0, _T("测试1")); // 插入第一个标签
m_tab.InsertItem(1, _T("测试2")); // 插入第二个标签
m_jzmDlg.Create(IDD_DIALOG1, &m_tab); // 创建第一个标签页
m_androidDlg.Create(IDD_DIALOG2, &m_tab); // 创建第二个标签页
m_tab.GetClientRect(&tabRect); // 获取标签控件客户区Rect
// 调整tabRect,使其覆盖范围适合放置标签页
tabRect.left += 1;
tabRect.right -= 1;
tabRect.top += 25;
tabRect.bottom -= 1;
// 根据调整好的tabRect放置m_jzmDlg子对话框,并设置为显示
m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
// 根据调整好的tabRect放置m_androidDlg子对话框,并设置为隐藏
m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
- 运行程序,查看结果,这时我们发现切换标签时,标签页并不跟着切换,而总是显示一个对话框。 我们要实现的是标签页的切换效果,所以还要为m_tab标签控件的通知消息TCN_SELCHANGE添加处理函数,双击Tab control控件,并添加如下代码:
CRect tabRect; // 标签控件客户区的Rect
// 获取标签控件客户区Rect,并对其调整,以适合放置标签页
m_tab.GetClientRect(&tabRect);
tabRect.left += 1;
tabRect.right -= 1;
tabRect.top += 25;
tabRect.bottom -= 1;
switch (m_tab.GetCurSel())
{
// 如果标签控件当前选择标签1,则显示m_jzmDlg对话框,隐藏m_androidDlg对话框
case 0:
m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
break;
// 如果标签控件当前选择标签2,则隐藏m_jzmDlg对话框,显示m_androidDlg对话框
case 1:
m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
break;
default:
break;
}
- 再运行程序,最终的标签页切换效果如下面两图: