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消息来对切换了标签时进行一些动作。