В палитре элементов найдите "Tab Control" и поместите его в ваш диалог. Теперь два раза кликните по нему мышкой при нажатой клавише Ctrl. Вам будет предложено создать переменную класса, соглашайтесь. Введите m_Tab в качестве имени и CTabCtrl в качестве типа. По умолчанию наш объект пока не содержит ни одной закладки. Чтобы они появились, их необходимо создать с помощью функции InsertItem. Это можно сделать в OnInitDialog:
BOOL CTabDlg::OnInitDialog {
TC_ITEM tci; // в нее записываются параметры создаваемой закладки
memset(&tci,0,sizeof(tci));
tci.mask = TCIF_TEXT; // у закладки будет только текст
tci.pszText = "Закладка 1"; // название закладки
m_Tab.InsertItem(0, &tci); // первая закладка имеет индекс 0
tci.pszText = "Закладка 2";
m_Tab.InsertItem(1, &tci); // вставляем вторую закладку
return TRUE;
}
Ну вот, у нас есть две закладки. Теперь нам нужно поместить что-нибудь внутрь.
Прежде всего, для каждой из закладок нужно создать диалог, который будет отображаться при выборе этой закладки. Например, создайте для начала два диалога – IDD_TABPAGE1 и IDD_TABPAGE2. В свойствах каждому поставьте тип "Child" – "дочерний" (properties|styles|style:Child) и "Без рамки" (properties|styles|border:None). Для каждого диалога нужно создать соответствующий класс. Это можно сделать, два раза кликнув по поверхности диалога в редакторе. У меня получились классы CTabPage1 и CTabPage2.
Нужные контролы и обработчики в диалоги можно поместить на данном этапе, а можно и потом (хотя для оценки размеров лучше все-таки это сделать сейчас. Потом можно будет внести любые изменения). Но для тестирования какие-нибудь отличительные знаки в них поставить нужно обязательно , а то вы просто не узнаете, какие диалоги где у вас выводятся – все будут одинаковые.
В классе вашего диалога, кому принадлежит TabCtrl (в примере — CTabDlg) добавьте переменную-указатель на текущий диалог:
protected:
CTabCtrl m_Tabs;
CDialog* m_pTabDialog; // <--- добавить
В конструкторе класса проинициализируйте ее в 0:
CTabDlg::CTabDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTabDlg::IDD, pParent) {
m_pTabDialog=0;
}
Зайдите в ClassWizard и для TabCtrl добавьте обработчик TCN_SELCHANGE (изменение закладки).
Теперь мы будем динамически удалять прошлый диалог/создавать новый и выводить его в TabControl.
Вот как это выглядит:
void CTabDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) {
int id; // ID диалога
// надо сначала удалить предыдущий диалог в Tab Control'е:
if ((m_pTabDialog) {
m_pTabDialog->DestroyWindow;
delete m_pTabDialog;
}
// теперь в зависимости от того, какая закладка выбрана,
// выбираем соотв. диалог
switch(m_Tab.GetCurSel+1) // +1 для того, чтобы порядковые номера закладок
// и диалогов совпадали с номерами в case
{
// первая закладка
case 1:
id = IDD_TABPAGE1;
m_pTabDialog = new CTabPage1;
// тип указателя соответствует нужному диалогу,
// иначе добавленный в диалог код не будет функционировать
break;
// вторая закладка
case 2:
id = IDD_TABPAGE2;
m_pTabDialog = new CTabPage2;
break;
// все остальные закладки, если они есть,
// будут здесь тоже представлены, каждая – отдельным case
// а если обработка такого номера не предусмотрена
default:
m_pTabDialog = new CDialog; // новый пустой диалог
return;
} // end switch
// создаем диалог
m_pTabDialog->Create(id, (CWnd*)&m_Tabs); //параметры: ресурс диалога и родитель
CRect rc;
m_Tab.GetWindowRect(&rc); // получаем "рабочую область"