С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/32: Рейтинг темы: голосов - 32, средняя оценка - 4.63
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81

Как работать создавать вкладки с CTabCtrl?

03.06.2009, 23:15. Показов 6081. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

MFC.

У меня возникла необходимость создать вкладки в диалоге, но работа с CPropertySheet меня не устраивает.

Работал ли кто-нибудь с вкладками при помощи элемента CTabCtrl (не зря же он создан?), и если да, то объясните пожалуйста, как управлять вкладками?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2009, 23:15
Ответы с готовыми решениями:

Трудности с размещением страниц на CTabCtrl внутри другого CTabCtrl
На диалоговом окне есть компонент TAB_CTRL1 типа CTabCtrl, на котором расположены несколько страниц--pPage1, pPage2, pOrbitDefinition,...

Стандартная библиотека (не framework) которая способна работать с png, gif и уметь создавать void*
Всем привет! Мне нужно получить буфер типа void* с пикселями из gif и png файла. То есть, нужен какой-то инструмент, способный...

CTabCtrl - как с ним работать?
Попытался разобраться с этим компонентом, да застрял. Задачка: разместить на разных вкладках объекта различные компоненты (скорее всего,...

14
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
03.06.2009, 23:24
Добавляешь этот контрол на диалог, привязываешь к нему переменную

далее

переменная.InsertItem(0, "Первая вкладка");
переменная.InsertItem(1, "Вторая вкладка");
...

естессно, они при этом будут пустые, это тебе не c#
наполнение и переключение придется реализовать самому
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
03.06.2009, 23:28  [ТС]
Так. Насчет метода InsertItem. Он только добавляет сами вкладки? Ладно.

А возможно ли полключать к нему что-то вроде готового PropertyPage-ресурса?

Понятное дело, что это не C#. Я работал когда-то с вкладками, используя класс CPropertySheet, добавляя в него методом AddPage страницы CPropertyPage, ресурсы для которых предварительно заготавливал.

А с этим контролом можно так же?

Если нет, то можно хотя бы направление, как осуществлять это самое наполнение и переключение?

Спасибо.

PS: добавил, привязал .
PPS: в книжках я находил только описание метода с CPropertySheet .
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
03.06.2009, 23:38
можно нашлёпать готовых диалогов со стилем Сhild, визардом сделать классы, потом

C++
1
2
3
4
5
dlg1.Create(CDialog1::IDD, this);
CRect rc;
GetWindowsRect(&rc);
// подстраиваем координаты
dlg1.SetWindowsPos(NULL, ......
адреса этих диалогов неплохо бы засунуть в поле Data таб-контрола (SetItemDataPtr), это поможет при переключении

потом добавляем обработчик переключения табов, а там
C++
1
2
3
const int selected = tabCtrl_.GetCurSel(); // текущий выбранный таб
CWnd* dlg = reinterpret_cast<CWnd*>(tabCtrl_.GetItemDataPtr(selected));
dlg->ShowWindow(SW_SHOW); // показываем выбранный диалог
код набрал прямо здесь так что могут быть неточности, но примерно так...

там ещё будет некоторый гемор с тем, чтобы по клавише Tab форус прыгал внутрь диалога, но щас не помню, чё там за запарки... Вроде какие-то флаги надо установить... впрочем, пока об этом можешь не париться :-D
1
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
03.06.2009, 23:47  [ТС]
Спасибо, в общем ясно. Пара уточнений:

CDialog1 - это класс ресурса для страницы?

Свойство Child обязательно, или достаточно только границы отключить?

И, если можно, такой вопрос (не совсем по теме):
Переустановил себе студию (снес Express и поставил наконец-то Professional), и теперь, когда я захожу в ClassWizard из контекстного меню, выскакивает ошибка какого-то сценария (другие способы не проверял еще, но думаю будет так же; на другом компе проверял специально - работало всё). Картинка с окошком во вложении.
Миниатюры
Как работать создавать вкладки с CTabCtrl?  
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
03.06.2009, 23:52  [ТС]
PS: а здесь точно reinterpret_cast?? может надо dynamic_cast? он же вроде с иерархией наследования работает.
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.06.2009, 00:10
Xardas,
CDialog1 - это класс, сгенерированный визардом на основе темплейта диалога (Add class)

Свойство Child обязательно,
не-child я не пробовал, как-то желание заняться сексом в гамаке пока не возникало (:

выскакивает ошибка какого-то сценария
хз, с таким не сталкивался
думаю, что-то порушено в ИЕ
попробуй отключить все аддоны, поставь 7, 8 версию...

Добавлено через 2 минуты 1 секунду
а здесь точно reinterpret_cast??
точно. ты значение типа DWORD_PTR преобразуешь в нужный тебе тип, никакой иерархии нет
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
04.06.2009, 00:21  [ТС]
Из-за этой ошибки не могу по человечески работать с класс-визардом, а ВСЁ вручную делать как-то неохота - всё-таки Visual, пусть и не C# .

Windows Vista, IE8.
та же ошибка начала выскакивать еще когда была 7 версия IE и студия стояла 2005. собственно потому и замутил всю историю с переходом на 2008 студию. не помогло.

Насчет reinterpret_cast - стормозил. теперь увидел.

На старом компе поставил Windows 7, и туда эту же 2008 студию - ClassWizard без проблем вообще работает. Тут - не знаю уже, что делать.
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.06.2009, 00:32
Из-за этой ошибки не могу по человечески работать с класс-визардом
PS. чтобы найти решение этой проблемы мне потребовалось 37 секунд (из них 11 - на открытие банки джин-тоника) и 2 запроса в гоогле. :-D
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
04.06.2009, 00:34  [ТС]
Цитата Сообщение от Rififi Посмотреть сообщение
Из-за этой ошибки не могу по человечески работать с класс-визардом
PS. чтобы найти решение этой проблемы мне потребовалось 37 секунд (из них 11 - на открытие банки джин-тоника) и 2 запроса в гоогле. :-D
я не гордый (стал) и буду благодарен за подсказку .
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.06.2009, 00:42
первый запрос в гоогле: по скольку по-русски пытаться искать что-то бесполезно, я попытался представить, как эта фраза будет звучать в оригинале:
"visual studio wizard object is not supported this method"
неудачно, вывелась какая-то *****

(тут я открываю банку джин-тоника.. хорошо пошло... )

потом я замечаю номер строки, и пишу такой запрос:

"visual studio wizard error line 815"

и вуаля (((: Проблема специфичная для IE8, есть workaround
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
04.06.2009, 00:48  [ТС]
Rififi, ладно, спасибо. нашел что-то на английском.
попробую устранить. неужели нельзя исправить что-то, не залезая в реестр ? или меня опять гуглем в дебри занесло??
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.06.2009, 00:52
насколько я понял, нельзя. это именно приделывание костыля.
наверное команда которая делает IE немного по***лась с визуальщиками, вот они и чутка подгадили им :lol:
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
04.06.2009, 02:56  [ТС]
все возможно
PS: проблема кажись ушла. спасибо, что тоже не гордый

Добавлено через 28 минут 22 секунды
хе, все равно не все так просто.
Вот как сделал я.

В классе главной формы у меня есть переменная класса CTabCtrl, связанная с контролом:
C++
1
CTabCtrl m_tabs;
В этом же классе я сделал переменную класса CPage1 (у меня другое) - не указатель (!):
C++
1
CPage1 m_page1;
, т.е. создается в самом начале.

Далее, в методе OnInitDialiog класса главной формы добавляю действия для подключения первой и единственной пока что вкладки (метода SetItemDataPtr я не нашел, поэтому пока что не привязываю никакого адреса окна к вкладке. также нет у CTabCtrl метода SetItemData. возможно, можно в конструкторе инициализировать lParam?):
C++
1
2
3
4
5
6
    m_tabs.InsertItem(0,"Процессы");
    m_page1.SetOwner(dynamic_cast<CWnd*>(&m_tabs));
    CRect rc;
    m_tabs.GetClientRect(&rc);
    m_page1.SetWindowPos(dynamic_cast<CWnd*>(&m_tabs),rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,0);
    m_page1.ShowWindow(SW_SHOW);
И все равно есть ошибка. Признаюсь, я на уровне создания окон во время выполнения еще не работал, потому плаваю в теме, хотя общие принципы понимаю свободно.

PS: стоп. а Create же нужно вызывать?? недостаточно ведь одного конструктора

Добавлено через 7 минут 31 секунду
нормально. осталось только подогнать позицию окна.

Добавлено через 1 час 25 минут 58 секунд
Итак, вот рабочий код. Может и не самый оптимальный по количеству действий, но тем не менее (для двух вкладок):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    m_page1.Create(CPage1::IDD,&m_tabs);
    m_page2.Create(CPage2::IDD,&m_tabs);
 
    TC_ITEM tci;
    tci.mask=TCIF_TEXT | TCIF_PARAM;
    tci.iImage=-1;
 
    tci.pszText="Вкладка 1";
    tci.lParam=(LPARAM)&m_page1;
    m_tabs.InsertItem(0,&tci);
 
    tci.pszText="Вкладка 2";
    tci.lParam=(LPARAM)&m_page2;
    m_tabs.InsertItem(1,&tci);
 
    m_page1.SetWindowPos(NULL,30,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
    m_page1.ShowWindow(SW_SHOW);
 
    m_page2.SetWindowPos(NULL,30,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
    m_page2.ShowWindow(SW_HIDE);
А вот смена вкладок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void CTabbedDlg::OnTcnSelchangeTabTabs(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_SHOW);
    *pResult = 0;
}
 
void CTabbedDlg::OnTcnSelchangingTabTabs(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;
}
Однако, взаимодействовать с элементами, расположенными на страницах вкладок никак нельзя - они как будто бы картинка.

Как активировать обработку сообщений от них?
0
16 / 16 / 2
Регистрация: 08.05.2009
Сообщений: 81
28.06.2009, 16:31  [ТС]
Вижу, дать исчерпывающий ответ ни у кого нет малейшего желания. Жаль.

На rsdn, sourceproejct и в других источниках я находил разные примеры, но, почему-то когда пытался вручную воспроизводить предложенное описание реализации вкладок, всегда, видимо, упускал какую-то деталь, которая наверное всеми без исключения подразумевается, но не упоминается .

В общем, забил я на это дело. Буду премного благодарен тем опытным людям, кто не поленится полностью изложить концепцию создания пользовательского интерфейса с вкладками.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.06.2009, 16:31
Помогаю со студенческими работами здесь

Как создавать вкладки QTab программно?
Как создавать вкладки QTab программно? Т.е. запустили программу, открылось MainWindow с одной вкладкой. Чтобы при нажатии на pushButton...

[WPF] Как динамически создавать графические элементы и как с ними работать?
Здравствуйте! Я не очень понимаю как динамически в C# создавать графические элементы и как с ними работать. Статически задать в XAML...

Как создавать файлы в нужной мне директории, а потом работать с этими файлами?
Хочу, чтобы программа создавала файлы в нужной мне директории, а потом работала с этими файлами: Например: В текущей директории (там...

Что нужно знать, чтобы работать программистом и создавать не бесполезные программы?
Что нужно знать, чтобы работать программистом и создавать не бесполезные программы? Или как придумывать такие программы?

Просьба откликнутся тем кто умеет создавать серверы работать с соц движками
Просьба откликнутся тем кто умеет создавать серверы работать с соц движками помогите пишите в аську 377459065


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru