Використання класу CTabCtrl h2>
Tab control - це могутній засіб для вирішення багатьох
проблем в інтерфейсі додатків. Воно дозволить істотно збільшити швидкість
роботи вашого додатки, розбити на "частини" діалог у зручній для
користувача формі. p>
У MFC є вбудований клас по роботі з Tab control --
клас CTabCtrl. p>
Для практики напишемо програму, яка буде
використовувати клас CTabCtrl і в якій буде три "закладку" --
діалогу. p>
Кроки створення проекту: p>
1) Спочатку створимо проект tab_control типу діалог. p>
2) В редакторі ресурсів додати Tab Control в шаблон
діалогу і призначимо йому ID = IDC_TAB. p>
3) Використовуючи ClassWizard, додамо змінну-член типу
CTabCtrl з властивістю Control. p>
4) У OnInitDialog проініціалізіруем необхідні
змінні для CTabCtrl. p>
5) Використовуючи ClassWizard, додамо обробку
необхідних повідомлень від Tab control 'я. p>
6) Видалимо за собою непотрібні змінні. p>
Для початку зробіть перші три пункти, створіть
змінну m_ctrTab класу CTabCtrl. Після цього у функції BOOL
CTab_controlDlg:: OnInitDialog () добавте наступне: p>
... p>
TC_ITEM TabItem; p>
TabItem.mask =
TCIF_TEXT; p>
TabItem.pszText =
"Закладка1"; p>
m_ctrTab.InsertItem (
0, & TabItem); p>
TabItem.pszText =
"Закладка2"; p>
m_ctrTab.InsertItem (
1, & TabItem); p>
TabItem.pszText =
"Закладка3"; p>
m_ctrTab.InsertItem (
2, & TabItem); p>
... p>
Це код ініціалізації Tab Control, ми створюємо три
закладки. Тепер нам треба, щоб при натискання на будь-яку закладку, на екрані
з'являлося те, що нам потрібно. Найпростіший варіант - це використовувати на
кожну закладку по діалогу - і потім просто в області Tab Control'а - виводити
потрібний діалог, в залежності від поточної закладки. p>
Зробимо це. Додамо три діалогу в редакторі ресурсів
і створимо кожному з них по класу - спадкоємцю від CDialog. Назвемо ці класи
CPage1, CPage2 і CPage3 (файли Page1.cpp (h), Page2.cpp (h), Page3.cpp (h)). p>
У властивостях цих трьох діалогів поставте Style як
"Child" і Border як "none" - це дуже важливо, а в самих
діалогах створіть будь-які елементи (наприклад, типу Static Text), щоб
було видно відмінність. p>
Напишіть ці три рядки на початку файлу
tab_controlDlg.cpp p>
# include
"Page1.h" p>
# include
"Page2.h" p>
# include
"Page3.h" p>
Продовжимо в OnInitDialog: p>
Треба послідовно створити всі сторінки, причому
покажчики на них зберігаються в самому m_ctrTab! У цьому прикладі ми Використовувати
lParam структури TCITEM як сховище покажчика. Тепер змінні pPage1,
pPage2 і pPage3 більше не потрібні - покажчики зберігаються в надійному місці! Для
кожної сторінки викликається метод ShowWindow () - для відображення перше, і
приховування інших сторінок. p>
... p>
CPage1 * pPage1; p>
pPage1 = new
CPage1; p>
TabItem.mask =
TCIF_PARAM; p>
TabItem.lParam =
(LPARAM) pPage1; p>
m_ctrTab.SetItem (0,
& TabItem); p>
VERIFY (pPage1-> Create (CPage1:: IDD,
& m_ctrTab )); p>
pPage1-> SetWindowPos (NULL,
10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); p>
pPage1-> ShowWindow (SW_SHOW); p>
CPage2 * pPage2; p>
pPage2 = new
CPage2; p>
TabItem.mask =
TCIF_PARAM; p>
TabItem.lParam =
(LPARAM) pPage2; p>
m_ctrTab.SetItem (1,
& TabItem); p>
VERIFY (pPage1-> Create (CPage2:: IDD,
& m_ctrTab )); p>
pPage2-> SetWindowPos (NULL,
10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); p>
pPage2-> ShowWindow (SW_HIDE); p>
CPage3 * pPage3; p>
pPage3 = new
CPage3; p>
TabItem.mask =
TCIF_PARAM; p>
TabItem.lParam =
(LPARAM) pPage3; p>
m_ctrTab.SetItem (2,
& TabItem); p>
VERIFY (pPage1-> Create (CPage3:: IDD,
& m_ctrTab )); p>
pPage3-> SetWindowPos (NULL,
10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); p>
pPage3-> ShowWindow (SW_HIDE); p>
... p>
Тепер додамо код по відображенню поточної сторінки і
приховування попередньої. Для цього додамо обробники повідомлень TCN_SELCHANGE і
TCN_SELCHANGING: p>
void
CTab_controlDlg:: OnSelchangingTab (NMHDR * pNMHDR, LRESULT * pResult) ( p>
// TODO: Add your
control notification handler code here p>
int nTab =
m_ctrTab.GetCurSel (); p>
TC_ITEM tci; p>
tci.mask =
TCIF_PARAM; p>
m_ctrTab.GetItem (nTab,
& tci); p>
ASSERT (tci.lParam); p>
CWnd * pWnd = (CWnd
*) tci.lParam; p>
pWnd-> ShowWindow (SW_HIDE); p>
* pResult = 0; p>
) p>
void
CTab_controlDlg:: OnSelchangingTab (NMHDR * pNMHDR, LRESULT * pResult) ( p>
int nTab =
m_ctrTab.GetCurSel (); p>
TC_ITEM tci; p>
tci.mask =
TCIF_PARAM; p>
m_ctrTab.GetItem (nTab,
& tci); p>
ASSERT (tci.lParam); p>
CWnd * pWnd = (CWnd
*) tci.lParam; p>
pWnd-> ShowWindow (SW_HIDE); p>
* pResult = 0; p>
) p>
Тут використовуються ті самі покажчики, які ми
сховали в OnInitDialog p>
Тепер звільнимо пам'ять і зруйнуємо діалогові вікна при
виході з програми. p>
Додамо функцію OnDestroy: p>
void
CTab_controlDlg:: OnDestroy () ( p>
CDialog:: OnDestroy (); p>
CWnd * pWnd; p>
TC_ITEM tci; p>
tci.mask =
TCIF_PARAM; p>
for (int i = 2;
i> = 0; i -) ( p>
m_ctrTab.GetItem (i,
& tci); p>
ASSERT (tci.lParam); p>
pWnd = (CWnd
*) tci.lParam; p>
pWnd-> DestroyWindow (); p>
delete pWnd; p>
) p>
) p>
Ну от і все, додаток готове. p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.realcoding.net/
p>