您的位置:首页 > 其它

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

2013-06-07 21:39 489 查看
对于使用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消息来对切换了标签时进行一些动作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: