VS中 tab控件的使用

最终实现的效果如下:

1.创建一个基于对话框的MFC工程,名称设置为“Drill”。删除“TODO: Place dialog controls here.”静态文本框、“OK”按钮和“Cancel”按钮。添加一个Tab Control控件,并为其关联一个CTabCtrl类型的控件变量m_tab。

2.创建两个新的对话框,ID分别设为IDD_PX、IDD_CX,两者都将Border属性设为None,Style属性设为Child。在对话框模板IDD_Drill_DIALOG中加入一个静态文本框,Caption属性设为“平行砂轮磨”。并为第一个对话框生成对话框类CPXDlg;并为第二个对话框生成对话框类CCXDlg。在生成类的时候基类要选“CDialog”

 

3.在“DrillDlg.h”文件中包含“PXDlg.h”和“CXDlg.h”两个头文件,然后继续在“DrillDlg.h”文件中为CDrillDlg类添加两个成员变量(注意:上面定义的对话框的类名要与下面的public下的类名一致,取名字后缀Dlg只是为了提示是对话框文件,可以不带,直接定义为CPX也可以,同样,后面的变量名也是可以直接定义为m_CX,只要全部一致即可):

4.在CDrillDlg对话框初始化时,我们也初始化标签控件。修改CDrillDlg::OnInitDialog()函数如下:

代码

BOOL CDrillDlg::OnInitDialog()   
{   
    CDialogEx::OnInitDialog();   
  
    // Add "About..." menu item to system menu.   
  
    // IDM_ABOUTBOX must be in the system command range.   
    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);   
        }   
    }   
  
    // Set the icon for this dialog.  The framework does this automatically   
    //  when the application's main window is not a dialog   
    SetIcon(m_hIcon, TRUE);         // Set big icon   
    SetIcon(m_hIcon, FALSE);        // Set small icon   
  
    // TODO: Add extra initialization here   
    CRect tabRect;   // 标签控件客户区的位置和大小   
  
    m_tab.InsertItem(0, _T("平行砂轮"));         // 插入第一个标签“平行砂轮”  
    m_tab.InsertItem(1, _T("成形砂轮"));  // 插入第二个标签“成形砂轮”   
    m_PXDlg.Create(IDD_PX, &m_tab);    // 创建第一个标签页   
    m_CXDlg.Create(IDD_CX, &m_tab); // 创建第二个标签页   
  
    m_tab.GetClientRect(&tabRect);    // 获取标签控件客户区Rect   
    // 调整tabRect,使其覆盖范围适合放置标签页   
    tabRect.left += 1;                  
    tabRect.right -= 1;   
    tabRect.top += 25;   
    tabRect.bottom -= 1;   
    // 根据调整好的tabRect放置m_PXDlg子对话框,并设置为显示   
    m_PXDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
    // 根据调整好的tabRect放置m_CXDlg子对话框,并设置为隐藏   
    m_CXDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);   
  
    return TRUE;  // return TRUE  unless you set the focus to a control   
} 

 

5. 为TAB控件的通知消息TCN_SELCHANGE添加处理函数:

代码
void CDrillDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)   
{   
    // TODO: Add your control notification handler code here   
    *pResult = 0;   
    CRect tabRect;    // 标签控件客户区的Rect   
  
    // 获取标签控件客户区Rect,并对其调整,以适合放置标签页   
    m_tab.GetClientRect(&tabRect);   
    tabRect.left += 1;   
    tabRect.right -= 1;   
    tabRect.top += 25;   
    tabRect.bottom -= 1;   
  
    switch (m_tab.GetCurSel())   
    {   
    // 如果标签控件当前选择标签为“平行砂轮”,则显示m_PXDlg对话框,隐藏m_CXDlg对话框   
    case 0:   
        m_PXDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
        m_CXDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);   
        break;   
    // 如果标签控件当前选择标签为“成形砂轮”,则隐藏m_PXDlg对话框,显示m_CXDlg对话框   
    case 1:   
        m_PXDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);   
        m_CXDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
        break;   
    default:   
        break;   
    }   
}  

参考链接:https://blog.csdn.net/phenixyf/article/details/26384369

                   http://blog.sina.com.cn/s/blog_a231c5270102w1vt.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值