Элемент управления закладка. Общая идея его такая. Создаем объект типа CtabCtrl. Потом добавляем закладки. К каждой закладке добавляем диалоговое окно. В виде классов это так: CTabCtrl - это сам класс, CDialog - это классы для закладок. Давайте попробуем сделать. Создаем приложение на базе диалогового окна, для простоты с именем TestTab. И добавляем на него сам элемент и две закладки, точно как в шаге "Шаг 203 - Использование CTabCtrl". Получаем две закладки в результате:
Каждой закладке нужно создать диалоговое окно. Давайте это сделаем. В ресурсах два диалоговых окна и два класса к ним. Имена классов CTabPage1 и CTabPage2. На первый диалог ради интереса элемент управлеия List, а на второй Edit. Стиль окон должен быть Child и лучше убрать все кнопки, чтобы диалог не закрывался когда вы нажимаете OK.
Для того, чтобы мы могли связать классы диалогов с окном свойств нам нужно получить доступ к этим классам. Давайте включим заголовочные файлы:
#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; }
Вот, если сейчас запустить приложение, то у нас будет две закладки, на которых разные элементы управления. Кода много. Но если Вы читали ранее, то с закладками более менее понятно, а добавилось только то, что каждую закладку мы связали с диалоговым окном. Это окно мы либо показываем либо прячем при смене закладки.