之前对mfc的了解也仅限于提到它时不会联想到肯德基而已,前些天要用mfc做一个管理系统,便可怜兮兮的到处去查资料,真的挺不容易。现在有点时间,就先把Tab Control控件的使用整理出来,方便后来者,也方便以后的自己。
使用示例:
一,准备工作:
建立基于对话框的mfc工程TabCtrl;并选中对话框的Title Bar 和 System Menu属性。
删除“确定”和“取消”按钮。
拖放Tab control 控件
二,设计CTab类:
为了将刚才添加的Tab control 控件玩弄于鼓掌之中,需要设计一个Ctab类,该类继承与CtabCtrl;
将Tab control 控件关联一个ctab的对象:m_tab;(关联方法:在TabCtrlDlg.h中添加:public:CTab m_tab;然后再在void CTabCtrlDlg::DoDataExchange(CDataExchange* pDX)方法中,添加:DDX_Control(pDX, IDC_TAB1, m_tab);并把Tab.h包含进来。);
在CTab类中添加变量:
LPCTSTR m_Title[16];//存储标签控件中所有窗口的标题.
CDialog* m_pPages[16];//存储标签控件中所有窗口指针
UINT m_IDD[16];//存储标签控件中所有窗口的ID
int m_nNumOfPages;//记录标签控件中标签的页数
int m_nCurrentPage;//记录标签控件中,当前页的页面索引.
构造函数中对变量初始化:
CTab::CTab()
{
m_nNumOfPages = 0;
m_nCurrentPage = 0;
}
添加Addpage方法,用以向控件中添加页面:
BOOL CTab::AddPage(LPCTSTR title,CDialog *pDialog,UINT ID)
{
if(16 == m_nNumOfPages)//最多添加16个页面
{
return FALSE;
}
m_nNumOfPages++;
m_pPages[m_nNumOfPages-1]=pDialog;//页面关联的窗口指针
m_IDD[m_nNumOfPages-1]=ID;//窗口ID
m_Title[m_nNumOfPages-1] = title;//窗口标题
return TRUE;
}
添加Show方法,用以显示某个标签页:
void CTab::Show(int n)//显示某个标签页中的窗口
{
for(int i=0;i<m_nNumOfPages;i++)//利用循环的方式创建页面
{
m_pPages[i]->Create(m_IDD[i],this);
InsertItem(i,m_Title[i]);
}
CRect tabRect, itemRect;
int nX, nY, nXc, nYc;
GetClientRect(&tabRect);
GetItemRect(0, &itemRect);
nX=itemRect.left;
nY=itemRect.bottom+1;
nXc=tabRect.right-itemRect.left-2;
nYc=tabRect.bottom-nY-2;
for( int nCount=0; nCount < m_nNumOfPages; nCount++ )//隐藏所有的窗口
{
m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
}
m_pPages[n]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);//显示指定 的窗口
}
添加鼠标左键按下的响应函数:
void CTab::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
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);
}
}
至此,CTab类终于搞完了。
三:添加标签页的对话框:
在此只做演示,因此,添加两个对话框资源,在属性中,取消 Title bar ;并把 Style设置为 Child;
分别关联类:CDialog1 和 CDialog2;
如果要对对话框的内容进行控制的话,就可以在这两个类中添加相应的方法及响应函数了。。。
四,CTabCtrlDialog中,对标签控件的调用:
添加变量:
private:
CDialog1 m_dlg1;
CDialog2 m_dlg2;
在BOOL CTabCtrlDlg::OnInitDialog()中调用AddPage方法:
m_tab.AddPage(_T("对话框一"),&m_dlg1,IDD_DIALOG1);
m_tab.AddPage(_T("对话框二"),&m_dlg2,IDD_DIALOG2);
运行一下:0 errors, 0 warings
一切 OK!!
阿哲
2012-1-4