首先在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用户会选不中,无法编辑。所以需尽量避免这种情况。