Есть возможность обрабатывать сообщение в одном месте OnTabChange(). Идея основана на том, что все наши страницы порождены от класса CDialog. Давайте заведем на него указатель:
class CTestTabDlg : public CDialog { // Construction public: CDialog* mDlg; ...... };
И присвоим этому указателю тот диалог, который виден, то есть первый.
...... tci.mask = TCIF_PARAM; tci.lParam = (LPARAM)Page1; m_Tabs.SetItem(0, &tci); Page1->Create(CTabPage1::IDD, &m_Tabs); Page1->SetWindowPos(NULL, 40, 40, 0, 0, SWP_NOSIZE | SWP_NOZORDER); Page1->ShowWindow(SW_SHOW); mDlg=Page1; ......
И переделаем реакцию на сообщение о смене закладки:
void CTestTabDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) { if(mDlg) { mDlg->ShowWindow(SW_HIDE); } switch(m_Tabs.GetCurSel()) { case 0: mDlg = Page1; break; case 1: mDlg = Page2; break; } if(mDlg) { mDlg->ShowWindow(SW_SHOW); } }
Как видите мы прячем текущую закладку, потом в зависимости от того какая страница текущая присваиваем mDlg указатель на диалог, который и выводим. Не знаю чем этот способ лучше или хуже, но надо обрабатывать всего одно событие.