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.运行程序,大功告成~~~ ^_^

原文地址:https://www.cnblogs.com/lxt287994374/p/3116354.html