Работа с CTabCtrl (MFC)

На нашем основном диалоге (там где будут сидеть вкладки) рисуем ТабКонтрол (он №19 на панели инструментов) по размеру соответствующий желаемым размерам будущих страниц.

Создаём шаблоны диалогов в редакторе ресурсов (это наши будущие страницы), на второй странице их св-в (щелчок правой кнопкой мыши на диалоге -> Properties) ставим каждому
Style = child
Border = None
Title bar = no

Размеры диалогов значения не имеет, им вовсе не обязательно быть одинаковыми и совпадать по размеру с ТабКонтролом.

Пусть класс нашего основного диалога зовётся COurDlg.
Тогда:

Члены класса COurDlg:
HWND m_TabPages[_d_TabPagesNum];
В заголовке класса COurDlg объявим количество будущих страниц в ТабКонтроле
#define _d_TabPagesNum 2
В конструкторе COurDlg::COurDlg
ZeroMemory(m_TabPages, sizeof(m_TabPages));
В COurDlg::OnInitDialog()
      //.........................
     //.........................

     //Счетчик для циклов
     int i;

     //Создадим страницы если ещё не созданы
     //(!!!) здесь предполагается что идентификаторы шаблонов диалогов равны IDD_DIALOG1, IDD_DIALOG1 + 1 и т.д.
     if (!m_TabPages[0])
     {
           for (i = 0; i < _d_TabPagesNum; i++)
           {
                 m_TabPages[i] = CreateDialog(AfxGetInstanceHandle(),
                                              
MAKEINTRESOURCE(IDD_DIALOG1 + i), m_TabCtrl, NULL);
           }
     }

     //Зададим страницам правильные размер и положение на ТабКонтроле
     CRect l_Rect;
     m_TabCtrl.GetClientRect(l_Rect);
     l_Rect.top            += 25;
     l_Rect.left           += 2;
     l_Rect.right          -= 2;
     l_Rect.bottom         -= 2;

     for (i = 0; i < _d_TabPagesNum; i++)
     {
           ::MoveWindow(m_TabPages[i], l_Rect.left, l_Rect.top, l_Rect.Width(), l_Rect.Height(), true);
     }
     
     //Создаём закладки в контроле
     for (i = 0; i < _d_TabPagesNum; i++)
     {
           CString c_Caption;
           c_Caption.Format("%d", i);
           m_TabCtrl.InsertItem(i, c_Caption /*Впишите сюда свои названия закладок*/);
     }

     //Делаем первую страницу активной
     m_TabCtrl.SetCurSel(0);
     ActivateTabPage(0);
Далее, создаём функцию-член класса COurDlg (она будет отображать нужную нам страницу и прятать остальные)
void COurDlg::ActivateTabPage(int p_NumPageToActivate)
{
     for (int i = 0; i < _d_TabPagesNum; i++)
     {
           ::ShowWindow(m_TabPages[i], ((i == p_NumPageToActivate) ? SW_SHOW : SW_HIDE));
     }
}
2) ТабКонтрол -> TCN_SELCHANGE
void COurDlg::OnSelchange***(NMHDR* pNMHDR, LRESULT* pResult) 
{
     ActivateTabPage(m_TabCtrl.GetCurSel());
     
     *pResult = 0;
}
3) Если вы также хотите обрабатывать смену страницы (в смысле - в зависимости от каких-то критериев менять страницу или нет), то делаем так:
 
Создаём обработчик ТабКонтрол -> TCN_SELCHANGING
void COurDlg::OnSelchanging***(NMHDR* pNMHDR, LRESULT* pResult)
{
      int l_OldPageNum = m_TabCtrl.GetCurSel();

      //если разрешить менять страницу то
      *pResult = 0;
      //если запретить менять страницу то
      *pResult = 1;
}
Всё. Радуемся жизни :)