![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
![]() |
Шаг 316 - Подробнее о CTabCtrlЭлемент управления закладка. Общая идея его такая. Создаем объект типа 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; } Вот, если сейчас запустить приложение, то у нас будет две закладки, на которых разные элементы управления. Кода много. Но если Вы читали ранее, то с закладками более менее понятно, а добавилось только то, что каждую закладку мы связали с диалоговым окном. Это окно мы либо показываем либо прячем при смене закладки. | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|