在MFC实现桌面程序时,可能会用到TabView效果,我实现的是最基本的效果,如下图:
下面介绍详细的实现过程,如果需要效果更好看些,自行美化。
1、 创建自定义MFCTabCtrl类MyMFCTabCtrl继承自CMFCTabCtrl。之所以要自己实现自定义的控件,主要是因为MFC自带的MFCTabCtrl无法实现标签页的关闭。怎么new一个新的类并继承该继承的父类,不再叙述。
2、 在自定义的类中需要重载左鼠标按下的消息。即添加如下图消息
消息处理函数如下,记住一定要先执行基类,即把执行父类中左键按下的消息代码放在最前面:
1 void CMyMFCTabCtrl::OnLButtonDown(UINT nFlags, CPoint point) 2 { 3 // TODO: 在此添加消息处理程序代码和/或调用默认值 4 //要先执行基类,否则界面会失去焦点 5 CMFCTabCtrl::OnLButtonDown(nFlags, point); 6 if(m_rectCloseButton.PtInRect(point)) 7 { 8 int nTab = GetActiveTab(); 9 if(nTab > -1) 10 { 11 //这个是我工程里面每个标签页的界面 12 CPortSet *dlg = (CPortSet *)GetTabWnd(nTab); 13 dlg->SendMessage(WM_DESTROY,0,0); 14 RemoveTab(nTab); 15 } 16 } 17 }
3、 在调用CMyMFCTabCtrl的类中定义变量:CMyMFCTabCtrl m_tabCtrl;实现代码如下:
m_tabCtrl.Create(CMyMFCTabCtrl::STYLE_FLAT,tabRect,this,1,CMFCTabCtrl::LOCATION_BOTTOM); m_tabCtrl.EnableScrollBar(SB_BOTH); m_tabCtrl.EnableActiveTabCloseButton();
4、 添加WM_SIZE消息函数,保证控件随窗口大小变化而变化。
void CIMU4View::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); //获取当前窗体的大小,用于设置tabctrl的大小 if(m_tabCtrl/*&& nType != 1*/) { CRect tabCtrlRect; m_tabCtrl.GetClientRect(&tabCtrlRect); //将控件大小转换为对话框中的区域坐标 ScreenToClient(&tabCtrlRect); //cx/m_viewRect.Width()是对话框的横向变化比例 tabCtrlRect.left = 0; tabCtrlRect.right = cx; tabCtrlRect.top = 0; tabCtrlRect.bottom = cy; m_tabCtrl.MoveWindow(&tabCtrlRect); } GetClientRect(&m_viewRect); }