Шаг 316 - Подробнее о CTabCtrl

Элемент управления закладка. Общая идея его такая. Создаем объект типа CtabCtrl. Потом добавляем закладки. К каждой закладке добавляем диалоговое окно. В виде классов это так: CTabCtrl - это сам класс, CDialog - это классы для закладок. Давайте попробуем сделать. Создаем приложение на базе диалогового окна, для простоты с именем TestTab. И добавляем на него сам элемент и две закладки, точно как в шаге "Шаг 203 - Использование CTabCtrl". Получаем две закладки в результате:

316_1.gif (498 b)

Каждой закладке нужно создать диалоговое окно. Давайте это сделаем. В ресурсах два диалоговых окна и два класса к ним. Имена классов CTabPage1 и CTabPage2. На первый диалог ради интереса элемент управлеия List, а на второй Edit. Стиль окон должен быть Child и лучше убрать все кнопки, чтобы диалог не закрывался когда вы нажимаете OK.

316_2.gif (6578 b)

Для того, чтобы мы могли связать классы диалогов с окном свойств нам нужно получить доступ к этим классам. Давайте включим заголовочные файлы:

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "TabPage1.h"
#include "TabPage2.h"

/////////////////////////////
// CTestTabDlg dialog

Объявим ссылки на эти классы:

class CTestTabDlg : public CDialog
{
	......
	// Implementation
protected:
	HICON m_hIcon;
	CTabPage1* Page1;
	CTabPage2* Page2;
	......
};

Создадим эти классы в конструкторе:

CTestTabDlg::CTestTabDlg(CWnd* pParent /*=NULL*/)
		: CDialog(CTestTabDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestTabDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	Page1=new CTabPage1;
	Page2=new CTabPage2;
}

И удалим при закрытии диалога:

BOOL CTestTabDlg::DestroyWindow() 
{
	delete Page1;
	delete Page2; 
	return CDialog::DestroyWindow();
}

Теперь нужен код для создания этих диалогов:

BOOL CTestTabDlg::OnInitDialog()
{
	......

	// TODO: Add extra initialization here
	TC_ITEM tci; 

	tci.mask = TCIF_TEXT;
	tci.iImage = -1; 
	tci.pszText = "One";

	m_Tabs.InsertItem(0, &tci); 
	tci.pszText = "Two"; 
	m_Tabs.InsertItem(1, &tci);

	tci.mask = TCIF_PARAM;
	tci.lParam = (LPARAM)Page1;
	m_Tabs.SetItem(0, &tci);

	Page1->Create(CTabPage1::IDD, &m_Tabs);
	Page1->SetWindowPos(NULL, 30, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	Page1->ShowWindow(SW_SHOW);

	tci.mask = TCIF_PARAM;
	tci.lParam = (LPARAM)Page2;
	m_Tabs.SetItem(1, &tci);

	Page2->Create(CTabPage2::IDD, &m_Tabs);
	Page2->SetWindowPos(NULL, 30, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	Page2->ShowWindow(SW_HIDE);

	return TRUE; // return TRUE unless you set the focus to a control
}

Воспользовавшись ClassWizard'ом нам теперь нужно перегрузить реакцию на смену закладки:

void CTestTabDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) 

{
// TODO: Add your control notification handler code here
	int iTab = m_Tabs.GetCurSel();
	TC_ITEM tci;
	tci.mask = TCIF_PARAM;
	m_Tabs.GetItem(iTab, &tci);
	CWnd* pWnd = (CWnd *)tci.lParam;
	pWnd->ShowWindow(SW_SHOW); 
	*pResult = 0;
}

void CTestTabDlg::OnSelchangingTab1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int iTab = m_Tabs.GetCurSel();
	TC_ITEM tci;
	tci.mask = TCIF_PARAM;
	m_Tabs.GetItem(iTab, &tci);
	CWnd* pWnd = (CWnd *)tci.lParam;
	pWnd->ShowWindow(SW_HIDE); 
	*pResult = 0;
}

Вот, если сейчас запустить приложение, то у нас будет две закладки, на которых разные элементы управления. Кода много. Но если Вы читали ранее, то с закладками более менее понятно, а добавилось только то, что каждую закладку мы связали с диалоговым окном. Это окно мы либо показываем либо прячем при смене закладки.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 09.02.2001