MFC中 Tab Control 控件的使用
实现的功能:
在一个标签控件中加入两个标签页,标签文本分别为“标签1”和“标签2”,点击不同的标签显示不同的标签页。
具体步骤如下:
1. 创建一个基于对话框的MFC工程,名称设置为“TestTap”。
2. 在自动生成的对话框模板IDD_TESTTAP_DIALOG中,删除“TODO: Place dialog controls here.”静态文本框、“OK”按钮和“Cancel”按钮。添加一个Tab Control控件,并为其关联一个CTabCtrl类型的控件变量m_tab。
3. 添加两个基于MFC对话框的类,类名为CTab1Dlg,CTab2Dlg。在资源视图里,就自动新生成了两个对话框IDD_TAB1DLG和IDD_TAB2DLG。然后两者都将Border属性设为 None,Style属性设为Child。
4. 在“TestTapDlg.h”文件中添加头文件:
#include “Tab1Dlg.h”
#include “Tab2Dlg.h”
然后继续在“TestTapDlg.h”文件中为CTestTapDlg类添加两个成员变量:
CTab1Dlg m_tab1Dlg;
CTab2Dlg m_tab2Dlg;
5. 在CTestTapDlg对话框初始化时,我们也初始化标签控件。修改CTestTapDlg::OnInitDialog()函数如下:
BOOL CTestTapDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 //初始化标签控件 CRect tabRect; // 标签控件客户区的位置和大小 m_tab.InsertItem(0, _T("标签1")); // 插入第一个标签 m_tab.InsertItem(1, _T("标签2")); // 插入第二个标签 m_tab1Dlg.Create(IDD_POETSORTDLG, &m_tab); // 创建第一个标签页 m_tab2Dlg.Create(IDD_POETRYSORTDLG, &m_tab); // 创建第二个标签页 m_tab.GetClientRect(&tabRect); // 获取标签控件客户区Rect // 调整tabRect,使其覆盖范围适合放置标签页 tabRect.left += 25; tabRect.right -= 1; tabRect.top += 1; tabRect.bottom -= 1; // 根据调整好的tabRect放置m_poetsortDlg子对话框,并设置为显示 m_tab1Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); // 根据调整好的tabRect放置m_poetrysortDlg子对话框,并设置为隐藏 m_tab2Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
6. 运行程序,查看结果,这时我们发现切换标签时,标签页并不跟着切换,而总是显示标签1。
7. 我们要实现的是标签页的切换效果,所以还要为m_tab标签控件的通知消息TCN_SELCHANGE添加处理函数,并修改如下:
void CTestTapDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 *pResult = 0; CRect tabRect; // 标签控件客户区的Rect // 获取标签控件客户区Rect,并对其调整,以适合放置标签页 m_tab.GetClientRect(&tabRect); tabRect.left += 25; tabRect.right -= 1; tabRect.top += 1; tabRect.bottom -= 1; switch (m_tab.GetCurSel()) { // 如果标签控件当前选择标签为“标签1”,则显示m_tab1Dlg对话框,隐藏m_tab2Dlg对话框 case 0: m_tab1Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); m_tab2Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); break; // 如果标签控件当前选择标签为“标签2”,则隐藏m_tab1Dlg对话框,显示m_tab2Dlg对话框 case 1: m_tab1Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); m_tab2Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); break; default: break; } }
8.运行程序,大功告成~~~ ^_^