Часто задаваемые вопросы и ответы по C/C++/Visual C++
Последнее обновление: 27.08.2003
FAQ по C/C++/Visual C++
Работа с сетью
Работа с CTabCtrl (MFC)
Составители: SUnteXx, Leprecon
Работа с CTabCtrl (MFC)
A: (HOMO PROGRAMMATIS)
Оригинальная ссылка: нету

На нашем основном диалоге (там где будут сидеть вкладки) рисуем ТабКонтрол (он №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;
}
Всё. Радуемся жизни :)
Содержание Обсудить на форуме « Предыдущая статья | Следующая статья »
Перейти к FAQ:  
FAQ составлен по материалам Форума на Исходниках.Ру.
Copyright © 2002 by Sources.ru. All rights reserved.