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) Удалим за собой ненужные переменные.
Для начала сделайте первые три пункта, создайте переменную m_ctrTab класса CTabCtrl. После этого в функцие BOOL CTab_controlDlg::OnInitDialog() добавте следующее:
...
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 );
...
Это код инициализации Tab Control, мы создаём три закладки. Теперь нам надо, чтобы при нажатие на любую закладку, на экране появлялось то, что нам нужно. Самый простой вариант - это использовать на каждую закладку по диалогу - и потом просто в области Tab Control'а - выводить нужный диалог, в зависимости от текущей закладки.
Сделаем это. Добавим три диалога в редакторе ресурсов и создадим каждому из них по классу - наследнику от CDialog. Назовем эти классы CPage1, CPage2 и CPage3( файлы Page1.cpp(h), Page2.cpp(h), Page3.cpp(h) ) .
В свойствах этих трёх диалогов поставте Style как "Child" и Border как "none" - это очень важно, а в самих диалогах создайте какие либо элементы ( например, типа Static Text ), чтобы было видно отличие.
Напишите эти три строчки в начале файла tab_controlDlg.cpp
#include "Page1.h"
#include "Page2.h"
#include "Page3.h"
Продолжимв OnInitDialog:
Надо последовательно создать все страницы, причём указатели на них хранятся в самом m_ctrTab !!! В этом примере мы ипользовали lParam структуры TCITEM как хранилище указателя. Теперь переменные pPage1, pPage2 и pPage3 больше не нужны - указатели хранятся в надежном месте! Для каждой страницы вызывается метод ShowWindow() - для отображения первой, и скрытия остальных страниц.
...
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);
...
Теперь добавим код по отображению текущей страницы и сокрытию предыдущей. Для этого добавим обработчики сообщений TCN_SELCHANGE и TCN_SELCHANGING :
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;
}
Здесь используются те самые указатели, которые мы спрятали в OnInitDialog
Теперь освободим память и разрушим диалоговые окна при выходе из приложения.
Добавимфункцию OnDestroy:
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;
}
}
Ну вот и всё, приложение готово.
Другие работы по теме:
Классификация элитного жилья
Классификация элитного жилья. Вся-то и беда в том, что такой классификации, четкой, структурированной и единой, в нашей стране до сих пор не существует. У нас вообще-то и с самим понятие элитное жилье не все определено. И все-таки, как же из этого положения выходят застройщики и риелторы?
Индуктивное умозаключение
Структура индуктивного умозаключения. Отличие индуктивного умозаключения от дедуктивного. Способы обоснования вывода неполной индукции.
Схема составления психолого педагогической характеристики класса
СХЕМА СОСТАВЛЕНИЯ ПСИХОЛОГО – ПЕДАГОГИЧЕСКОЙ ХАРАКТЕРИСТИКИ КЛАССА. 1. Общие сведения о классе. История его формирования, состав по возрасту и полу учащихся. Социальная характеристика семей учащихся. Общая характеристика успеваемости класса, дисциплина, характеристика общественных поручений учащихся класса.
Копилка педагогических ситуаций
Частное образовательное учреждение высшего профессионального образования НЕВСКИЙ ИНСТИТУТ УПРАВЛЕНИЯ И ДИЗАЙНА Факультет Психологии Контрольная работа
Социалистическая революция
Социалистическая революция — пролетарская революция, высший тип социальной революции, осуществляющей переход от капиталистической общественно-экономической формации к коммунистической формации. Согласно марксистской теории, социалистическая революция — пролетарская революция, в ходе которой происходит взятие политической власти рабочим классом,экспроприация класса капиталистов, уничтожение деления общества на классы, ликвидация эксплуатации человека человеком на основе общественной собственности на средства производства.
Тема Кол-во страниц
Психолингвистическая характеристика чтения как одного из видов речевой деятельности
Происхождение геометрии
Text Text Graphics Происхождение геометрии Работа ученицы 7 «Б» класса Нурмиевой Людмилы Graphics Содержание Почему возникла геометрия? Евклид – основатель геометрии
Логарифмические уравнения
Данная система упражнений может быть использована в качестве дополнения при изучении темы «Логарифмические уравнения» к любому учебнику по алгебре для 10-го класса.
Моя мама самая лучшая
СОЧИНЕНИЕ – РАССУЖДЕНИЕ на тему: МОЯ МАМА САМАЯ ЛУЧШАЯ Белевская средняя школа № 1 подготовил учащийся 10 «Д» класса Толстов Александр Белев 2002 год. Моя мама самая лучшая.
Bristol
Bristol - английская компания, выпускающая легковые автомобили одноименной марки. Компания Bristol Aeroplane Co. была основана Сэром Джорджем Вайтом. Изначально, с 1910 года она занималась производством летательных аппаратов.
Семнадцатая поправка
17-я поправка (фр. Rиglement 17, англ. Regulation 17) — закон, направленный против использования французского языка в образовательной системе провинции Онтарио, изданный в 1912 году консервативным правительством Джеймса Уитни. Закон запрещал использование французского языка как основного средства преподавания после 1 класса, и вообще как предмет после 4 класса.
Брендель, Кайо
Карел Йохан Брендель (26 октября 1915, Гаага — 25 июня 2007) — голландский марксист, теоретик «коммунизма рабочих советов» (рэтекоммунизма). Кайо — выходец из среднего класса.
Готтберг, Курт фон
Введение 1 Биография 2 Награды Список литературы Введение Курт фон Готтберг (нем. Curt von Gottberg; 11 февраля 1896(18960211) — 31 мая 1945) — государственный и военный деятель нацистской Германии. Обергруппенфюрер СС и генерал войск СС и полиции (30 июня 1944).
Табель о рангах
При равенстве класса по "Табели" военный чин считался выше придворного, а придворный выше гражданского. Чины в гвардии считались до 1884 года на два класса выше чем в армии, с1884 года на один класс выше.
Кнорринг, Богдан Фёдорович
Богдан Фёдорович Кнорринг (нем. Gotthard Johann von Knorring; 1744—1825) — генерал от инфантерии. Биография Воспитывался в сухопутном шляхетном кадетском корпусе; участвовал в сражениях при Ларге и Кагуле. 8 марта 1771 году награждён орденом св. Георгия 4 класса. В 1773 году был послан с Фокшанского конгресса полномочным послом России князем Григорием Орловым, к брату его Алексею (Чесменскому) и проехал всю европейскую Турцию до островов Антипарос и Наксос, где тогда был расположен флот, причём снял всю местность от Рущука до Константинополя и Дарданелльского пролива.
Чичагов, Василий Яковлевич
Василий Яковлевич Чичагов Васи́лий Я́ковлевич Чичаго́в (28 февраля (11 марта) 1726(17260311) — 4 апреля (16 апреля) 1809, Санкт-Петербург) — российский мореплаватель, адмирал (с 1782).
Классы в C++
Одной из основных черт C++, которой нет в С, является концепция классов. По существу, классы - самое важное понятие в C++. Классы похожи на структуры языка С. Однако структура С определяет только данные, ассоциированные с этой структурой.
Полиморфные Вектора
У вас есть другая возможность - определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса.
Индексирование
Чтобы задать смысл индексов для объектов класса используется функция operator[]. Второй параметр (индекс) функции operator[] может быть любого типа. Это позволяет определять ассоциативные массивы и т.п.
Свободная Память
Если вы пользовались классом slist, вы могли обнаружить, что ваша программа тратит на заметное время на размещение и освобождение объектов класса slink.
Добавление к Классу
Для производного класса можно определить данные и функции дополнительно к тем, которые наследуются из его базового класса. Это дает альтернативную стратегию обеспечить средства связанного списка.
Что у Земли внутри
Text Graphics ЗЕМЛЯ Что у Земли внутри Презентация для 5 класса Graphics Graphics Реконструкция движения плит Graphics
Израиль
стр. Израиль. Географические характеристики Израиля. Общие. 14 мая 1948 года было провозглашено государство Израиль. Израиль граничит с Ливаном на севере, с Сирией на северо-востоке, с Иорданией на востоке, с Египтом на юго-западе, а на западе омывается Средиземным морем.
Пищеварение 2 2
Text Text Graphics Работу выполнил Работу выполнил ученик 8б класса Артемьев Артём Graphics Graphics
Биологические особенности моллюсков
Text Graphics Классы Классы Ямкохвостые (Caudofoveata) Бороздчатобрюхие (Solenogastres) Панцирные (Polyplacophora) Моноплакофоры (Monoplacophora) Двустворчатые (Bivalvia) Лопатоногие (Scaphopoda) Брюхоногие (Gastropoda) Головоногие (Cephalopoda) † Rostroconchia Graphics
Обеспечение лазерной безопасности
Под лазерной безопасностью понимается совокупность технических, санитарно-гигиенических и организационных мероприятий, обеспечивающих безопасные условия труда персонала при использовании лазерных установок.
Живая и мертвая вода - коротко
Реферат по теме: Живая и мертвая вода”. Ученика 11 класса “Ю” “... На пути из Гаэты в Неаполь галера “Санта Лука” шла под парусами при свежем ветре. Находяс почти в 2х милях от Порты она остановилась почти неподвижно, несмотря на то, что все паруса были подняты. После осмотра руля и других частей корабля оказалось, что все в порядке, тогда матросы стали грести.