Tab control - это мощное средство для решению многих проблем в интерфейсе приложений. Оно позволят существенно увеличить скорость работы вашего приложения, разбить на "части" диалог в удобной для пользователя форме.
В MFC есть встроенный класс по работе с Tab control - класс CTabCtrl.
Для практики напишем программу, которая будет использовать класс CTabCtrl и в которой будет три "закладки" - диалога.
Шаги создания проекта:
1) Сначала создадим проект tab_control типа диалог. 2) В редакторе ресурсов добавить Tab Control в шаблон диалога и назначим ему ID = IDC_TAB. 3) Используя ClassWizard, добавим переменную-член типа CTabCtrl со свойством Control. 4) В OnInitDialog проинициализируем необходимые переменные для CTabCtrl. 5) Используя ClassWizard, добавим обработку необходимых сообщений от Tab control 'я. 6) Удалим за собой ненужные переменные.
... TC_ITEM TabItem; TabItem.mask = TCIF_TEXT; TabItem.pszText = "Закладка1"; m_ctrTab.InsertItem( 0, &TabItem ); TabItem.pszText = "Закладка2"; m_ctrTab.InsertItem( 1, &TabItem ); TabItem.pszText = "Закладка3"; m_ctrTab.InsertItem( 2, &TabItem ); ...
#include "Page1.h" #include "Page2.h" #include "Page3.h"
... CPage1* pPage1; pPage1 = new CPage1; TabItem.mask = TCIF_PARAM; TabItem.lParam = (LPARAM)pPage1; m_ctrTab.SetItem(0, &TabItem); VERIFY(pPage1->Create(CPage1::IDD, &m_ctrTab)); pPage1->SetWindowPos( NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); pPage1->ShowWindow(SW_SHOW); CPage2* pPage2; pPage2 = new CPage2; TabItem.mask = TCIF_PARAM; TabItem.lParam = (LPARAM)pPage2; m_ctrTab.SetItem(1, &TabItem); VERIFY(pPage1->Create(CPage2::IDD, &m_ctrTab)); pPage2->SetWindowPos (NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); pPage2->ShowWindow(SW_HIDE); CPage3* pPage3; pPage3 = new CPage3; TabItem.mask = TCIF_PARAM; TabItem.lParam = (LPARAM)pPage3; m_ctrTab.SetItem(2, &TabItem); VERIFY(pPage1->Create(CPage3::IDD, &m_ctrTab)); pPage3->SetWindowPos (NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); pPage3->ShowWindow(SW_HIDE); ...
void CTab_controlDlg::OnSelchangingTab(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here int nTab = m_ctrTab.GetCurSel(); TC_ITEM tci; tci.mask = TCIF_PARAM; m_ctrTab.GetItem(nTab, &tci); ASSERT(tci.lParam); CWnd* pWnd = (CWnd *)tci.lParam; pWnd->ShowWindow(SW_HIDE); *pResult = 0; } void CTab_controlDlg::OnSelchangingTab(NMHDR* pNMHDR, LRESULT* pResult) { int nTab = m_ctrTab.GetCurSel(); TC_ITEM tci; tci.mask = TCIF_PARAM; m_ctrTab.GetItem(nTab, &tci); ASSERT(tci.lParam); CWnd* pWnd = (CWnd *)tci.lParam; pWnd->ShowWindow(SW_HIDE); *pResult = 0; }
void CTab_controlDlg::OnDestroy() { CDialog::OnDestroy(); CWnd* pWnd; TC_ITEM tci; tci.mask = TCIF_PARAM; for (int i = 2; i>=0; i--) { m_ctrTab.GetItem(i, &tci); ASSERT(tci.lParam); pWnd = (CWnd *)tci.lParam; pWnd->DestroyWindow(); delete pWnd; } }