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

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

03.06.2009, 23:15. Показов 6117. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 15.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru