MFC中TabControls分页上使用Dialog窗口

首先在tabcontrol控件上添加子项:
m_TabControl.InsertItem(0, _T("页面A"));
m_TabControl.InsertItem(1, _T("页面B"));

然后在tabcontrol上创建分页:
m_page0.Create(IDD_DIALOG1, &m_TabControl);
m_page1.Create(IDD_DIALOG2, &m_TabControl);

下面需要初始化在tabcontrol上显示第一页的m_page0窗口。
m_page0.SetWindowPos(&wndTop, 5, 25, pageRect.right - pageRect.left -        10, pageRect.bottom - pageRect.top - 30, SWP_SHOWWINDOW);

然后,当用户点击控件抬头的子项时,控件m_tabControl会对其父窗体发送TCN_SELCHANGE消息,引发OnSelchange(NMHDR *pNMHDR, LRESULT * pResult)事件。我们需要在该事件中保证分页会同步更新。
void CAppDlg::OnSelchangeTab(NMHDR *pNMHDR, LRESULT * pResult)
{
         RECT pageRect;
	m_TabControl.GetWindowRect(&pageRect);
	m_page0.ShowWindow(SW_HIDE);
	m_page1.ShowWindow(SW_HIDE);//隐藏所有分页
	switch(m_TabControl.GetCurSel()){
	case 0:
		m_page0.SetWindowPos(&wndTop, 5, 25,
			pageRect.right - pageRect.left - 10, pageRect.bottom - pageRect.top - 30, SWP_SHOWWINDOW);

		break;
	case 1:
		m_page1.SetWindowPos(&wndTop, 5, 25,
			pageRect.right - pageRect.left - 10, pageRect.bottom - pageRect.top - 30, SWP_SHOWWINDOW);
		break;//各自显示
	}
	*pResult = 0;
}

最后,当我们需要自己在代码中选择具体的子项时,会发现系统没有自动引发OnSelchangeTab事件。我们需要自己构造由m_tabControl发给父窗体的消息并发送出去。
m_TabControl.SetCurSel(1);
NMHDR nmhdr;      
nmhdr.code = TCN_SELCHANGE;      
nmhdr.hwndFrom = m_TabControl.GetSafeHwnd();      
nmhdr.idFrom = IDC_TAB1;
::SendMessage(this->GetSafeHwnd(),WM_NOTIFY,MAKELONG(TCN_SELCHANGE,0),(LPARAM)(&nmhdr));

另外,对于在tabcontrol控件上显示的dialog窗体,注意其sytle必须为child。
还有一点,如果tabcontrol控件的父窗体style为child时,我们会发现,如果控件上显示的dialog窗体上有EditBox,运行后EditBox用户会选不中,无法编辑。所以需尽量避免这种情况。

你可能感兴趣的:(C++,c,C#,mfc)