MFC

MFC设置标签页

MFC

Posted by YiMiTuMi on December 24, 2019

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);
}

龙舌兰 – 为爱付出一切