MFC中 使用Tab Control 控件在对话框中添加属性页

 

对于使用Tab Control 给对话框加属性页的方法有很多,下面记录下感觉比较方便点的方法。(也是来自网上的资料,只是稍加整理)

 

首先需要自己建一个类,如:CTabSheet。这个类是从CTabCtrl继承来的,是用于Tab Control的控件类。

添加成员变量:

    CDialog* m_pPages[MAXPAGE]; //记录各子对话框的指针

    int m_nNumOfPages;
    int m_nCurrentPage;
    UINT m_IDD[MAXPAGE];
    LPCTSTR m_Title[MAXPAGE];

记得这个:#define MAXPAGE 20  //该类所能加载的标签的最大值

然后在构造函数里初始化:

    m_nNumOfPages = 0;
    m_nCurrentPage = 0;

接下来给此类添加方法:

1.AddPage方法,用于记录子对话框的指针和所使用对话框资源的ID号。

BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
    if( MAXPAGE == m_nNumOfPages )
        return FALSE;

    //保存目前总的子对话框数
    m_nNumOfPages++;

    //记录子对话框的指针、资源ID、要在标签上显示的文字
    m_pPages[m_nNumOfPages-1] = pDialog;
    m_IDD[m_nNumOfPages-1] = ID;
    m_Title[m_nNumOfPages-1] = title;

    return TRUE;
}

 

2.在使用AddPage加入了若干子对话框后,必须调用CTabSheet的Show方法来真正生成标签和子对话框。

void CTabSheet::Show(void)
{
    int i;

    //利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签
    for( i=0; i <m_nNumOfPages; i++ )
    {
        m_pPages[i]->Create(m_IDD[i],this );
        InsertItem( i, m_Title[i] );
    }

    //由于对话框显示时默认的是第一个标签被选中,所以应该让第一个子对话框显示,其他子对话框隐藏
    m_pPages[0]->ShowWindow(SW_SHOW);

    for( i=1; i < m_nNumOfPages;i++)
        m_pPages[i]->ShowWindow(SW_HIDE);

    SetRect();
}

3.生成好标签和子对话框后,调用CTabSheet::SetRect来计算并调整属性页的大小。

void CTabSheet::SetRect(void)
{
    CRect tabRect;   // 标签控件客户区的位置和大小
    GetClientRect(&tabRect);    // 获取标签控件客户区Rect 

    // 调整tabRect,使其覆盖范围适合放置标签页   
       tabRect.left += 25;                  
       tabRect.right -= 1;   
       tabRect.top += 1;   
       tabRect.bottom -= 1;

       // 根据调整好的tabRect放置子对话框,并设置为显示   
       m_pPages[0]->SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
       // 根据调整好的tabRect放置其他子对话框,并设置为隐藏  
     for( int nCount=1; nCount <m_nNumOfPages; nCount++ )
       m_pPages[nCount]->SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
}

 

4.在单击标签栏后,应该是相应的子对话框显示,正在显示的子对话框应该隐藏。因此利用类向导ClassWizard来处理WM_LBUTTONDOWN消息。

void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) 
{
    CTabCtrl::OnLButtonDown(nFlags, point);

    //判断是否单击了其他标签
    if(m_nCurrentPage != GetCurFocus())
    {
        //将原先的子对话框隐藏
        m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);
        m_nCurrentPage=GetCurFocus();
        //显示当前标签所对应的子对话框
        m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);
    }
}

 

OK ,此类添加成功,下面就开始使用Tab Control控件给对话框添加属性页了。

步骤如下:

1.添加基于MFC的子对话框类,继承于CDialog。

2.设置各个子对话框资源的属性:Style为Child, Border为None。

3.在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用类向导ClassWizard来为这个Tab Control创建一个CTabSheet的控件变量,如:m_sheet。

4.在主对话框的.h文件中实例化子对话框的对象,如:m_page1,m_page2。

5.在OnInitDialog()中加入:

m_sheet.AddPage(L"tab1", &m_page1, IDD_DIALOG1);
m_sheet.AddPage(L"tab2", &m_page2, IDD_DIALOG2);
m_sheet.Show();

O了~~~

这样利用CTabSheet这个类就可以轻松地在对话框上放置自己的属性页了,并且控件都分散在各子对话框类中,符合对象封装的思想。而且用这个方法来制作属性页就可以利用ClassWizard来轻松地生成消息映射处理Tab Control的消息了。例如:可以处理TCN_SELCHANGE消息来对切换了标签时进行一些动作。

 

posted @ 2013-06-07 21:39  紫清婷  阅读(1877)  评论(0编辑  收藏  举报