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用户会选不中,无法编辑。所以需尽量避免这种情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值