MFC设置标签页
经常看到一个页面中有很多个选卡,其实每个选卡就一个新的页面。
1)先建立一个底层的窗口,并在上面添加 Tab Control 控件。
2)定义变量
CTabCtrl m_TabCtrl; //Tab控件变量
Cxxx1 m_Tabxxx1; //标签页面
Cxxx2 m_Tabxxx2; //标签页面
3)绑定Tab控件变量
DDX_Control(pDX, IDC_TAB1, m_TabCtrl);
4)添加初始化函数,在 OnInitDialog() 函数里添加。
//设置位置,否则会占满屏,根据自设置
CRect TabRect;
m_TabCtrl.GetClientRect(&TabRect);
TabRect.left += 1;
TabRect.top += 22;
TabRect.right -= 1;
TabRect.bottom -= 1;
int iItem = 0;
m_TabCtrl.InsertItem(iItem, L"选卡名");
m_TabCtrl.SetCurSel(iItem);
m_Tabxxx1.Create(IDD_PAGE_xxx1, &m_TabCtrl);
m_TabNotAdjust.ShowWindow(SW_SHOW); //显示
m_TabNotAdjust.MoveWindow(TabRect); //位置
iItem++;
m_TabCtrl.InsertItem(iItem, L"选卡名");
m_TabToAdjust.Create(IDD_PAGE_xxx2, &m_TabCtrl);
m_TabToAdjust.ShowWindow(SW_HIDE);
m_TabToAdjust.MoveWindow(TabRect);
5)添加点击切换选卡事件(底层页面)
声明:
afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);
绑定函数:
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &Cxxx::OnTcnSelchangeTab1)
函数实现:(一个显示,另一个隐藏,每次只显示一个)
void Cxxx::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
if (m_TabCtrl.GetCurSel() == 0)
{
m_Tabxxx1.ShowWindow(SW_SHOW);
m_Tabxxx2.ShowWindow(SW_HIDE);
}
else if (m_TabCtrl.GetCurSel() == 1)
{
m_Tabxxx1.ShowWindow(SW_HIDE);
m_Tabxxx2.ShowWindow(SW_SHOW);
}
}
6)子窗口设置
将子窗口 Style 属性设置为 Child(子级)。
将子窗口 Border 属性设置为 None
通过判断鼠标点击标签头判断是否切换页面
xxx.h
virtual BOOL PreTranslateMessage(MSG* pMsg);
xxx.cpp
BOOL xxx::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_LBUTTONDOWN)
{
CPoint point;
GetCursorPos(&point);
CRect headerrect;
m_wndTabControl.GetWindowRect(&headerrect);
/*CPoint clientPoint = point ;
::ScreenToClient(this->m_hWnd,&clientPoint);
CRect listRect = m_pItemAbout->GetRect();
BOOL bIsInRect = ::PtInRect(&listRect,clientPoint);*/
BOOL bIsInRect = ::PtInRect(&headerrect, point);
if (bIsInRect)
{
//OnStnClickedStaticTable();
PostMessage(MESSAGE_xxx, NULL, NULL); //发送消息让 OnWndMsg 接受一下
}
}
return CDialog::PreTranslateMessage(pMsg);
}