Please observe the following routing :) :
BEGIN_MESSAGE_MAP(CYourDialog, CDialog)
ON_NOTIFY(TCN_SELCHANGING, IDC_TAB1, OnSelchangingTab)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab)
END_MESSAGE_MAP()
BOOL CYourDialog::OnInitDialog()
{
BOOL bResult(CDialog::OnInitDialog());
m_cTabControl.ModifyStyleEx(0, WS_EX_CONTROLPARENT);
m_cGeneralPage.Create(CPhaseGeneralPage::sm_uiResourceID, NULL);
m_cGeneralPage.SetParent(&m_cTabControl);
m_cGeneralPage.ModifyStyleEx(0, WS_EX_CONTROLPARENT);
m_cTabControl.InsertItem(TCIF_TEXT|TCIF_PARAM,
0,
_T("first"),
(LPARAM) &m_cGeneralPage);
m_cParameterPage.Create(CPhaseParameterPage::sm_uiResourceID, NULL);
m_cParameterPage.SetParent(&m_cTabControl);
m_cParameterPage.ModifyStyleEx(0, WS_EX_CONTROLPARENT);
m_cTabControl.InsertItem(TCIF_TEXT|TCIF_PARAM,
1,
_T("second"),
0,
(LPARAM) &m_cParameterPage);
m_cUserPage.Create(CPhaseUserPage::sm_uiResourceID, NULL);
m_cUserPage.SetParent(&m_cTabControl);
m_cUserPage.ModifyStyleEx(0, WS_EX_CONTROLPARENT);
m_cTabControl.InsertItem(TCIF_TEXT|TCIF_PARAM,
2,
_T("third"),
0,
(LPARAM) &m_cUserPage);
AdjustContent();
ActivatePage(0, true);
return bResult;
}
void CYourDialog::AdjustContent()
{
m_cTabControl.GetClientRect(&cRect);
cRect.DeflateRect(2, 22, 3, 2);
int iCount(m_cTabControl.GetItemCount());
while (iCount--) {
TCITEM tcItem;
tcItem.mask = TCIF_PARAM;
if (m_cTabControl.GetItem(iCount, &tcItem)) {
if (tcItem.lParam) {
CDialog* pcPage = (CDialog*) tcItem.lParam;
pcPage->MoveWindow(&cRect, FALSE);
}
}
}
}
void CYourDialog::OnSelchangingTab(NMHDR* , LRESULT* pResult)
{
ActivatePage(m_cTabControl.GetCurSel(), false);
*pResult = 0;
}
void CPhaseEditDialog::OnSelchangeTab(NMHDR* , LRESULT* pResult)
{
ActivatePage(m_cTabControl.GetCurSel(), true);
*pResult = 0;
}
void CYourDialog::ActivatePage(int iPage, bool bActivate)
{
TCITEM tcItem;
tcItem.mask = TCIF_PARAM;
if (m_cTabControl.GetItem(iPage, &tcItem)) {
if (tcItem.lParam) {
CDialog* pcPage = (CDialog*) tcItem.lParam;
if (bActivate) {
pcPage->UpdateData(FALSE);
pcPage->ShowWindow(SW_SHOW);
pcPage->SetFocus();
} else {
pcPage->UpdateData(TRUE);
pcPage->ShowWindow(SW_HIDE);
}
}
}
}