Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CTabCtrl Visual Studio 2013
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
nice_vladi
Всем привет!

Делаю графическое приложение в Visual Studio 2013. Столкнулся со следующей проблемой:

Имеется CTabCtrl (Tab0) в нем расположены три вкладки. В первой из этих вкладок вложен еще один CTabCtrl (Tab1). В остальных - элементы управления. В Tab1 имеются свои 3 вкладки, на которых расположены различные элементы управления, edit и т.д.

При взаимодействии с любым из элементов в Tab1 (редактирование, просто клацанье мышкой, т.е. любое взаимодействие) и последующем смене фокуса окна программы (допустим, ЛКМ на рабочий стол) происходит зависание программы.

При этом поднимается загрузка процессора, без отжирания памяти.
Самым интересным мне показалось, что при взаимодействии с элементами в Tab1 и последующем переключении Tab0 а другую вкладку - все работает нормально.

Спасибо!

Upd0.
Зависание происходит даже без выполнения каких-либо обработчиков элементов на вкладке (создал пустую вкладку, набросал случайных элементов. Даже DDX выбросил)

Upd1.
Примерно понял, в чем затык. Style вкладок контролбара Tab1 - Child. При смене на другой - зависания нет.
Однако, при другом стиле, не происходит встраивания Tab1 в одну из вкладок Tab0, т.е. проблема все еще имеет место быть.

Upd2.
Сменил style вкладок child -> popup и принудительно указал предком Tab1. Корявое решение, при работе с этими вкладками постоянно теряется фокус окна. Ничего лучше не придумал. Проблема не решена, это временный костыль.
DASM
Вы что, на MFC в 2017 году пишите? krapula.gif .NET освоить быстрее, чем один единственный срайный табктрл
nice_vladi
Цитата(DASM @ Dec 11 2017, 21:56) *
Вы что, на MFC в 2017 году пишите? krapula.gif .NET освоить быстрее, чем один единственный срайный табктрл


Оффтоп:
Да, MFC. Вообще, мне больше Qt импонирует) Но досталась поддержка проекта, писанного не мной, писанного кривовато, и писанного в Visual Studio + MFC. Так что деваться некуда, приходится учиться.

По делу:
Кстати, все-таки выбросил Tab1 из вкладки Tab0 и добавил все вкладки из Tab1 в Tab0. Пояснение прикрепил в виде схемы (Вариант 2 - текущий вариант). Однако Вариант 1 мне нравится больше. Но в таком виде зависание программы, описанное в стартовом сообщении.



Решения проблемы так и не нашлось. Буду очень благодарен тому, кто объяснит такое поведение программы smile3046.gif
alexunder
Когда-то у меня был проект на MFC с вкладками, уже в то время можно было все сделать на Windows Forms из .NET, но клиент хотел совместимость с Windows 98 посему пришлось ваять на MFC. СTabCtrl - я так понял это пустышка, нужно все делать ручками. В общем, у меня был новый класс СTabCtrlEnhanced : СTabCtrl. В него добавил массив типа CDialog - диалогов для каждой вкладки соответственно и два новых метода:
InitializeTabs() - для инициализации диалогов вкладок, вызывается один раз родителем.
OnTcnSelchange() - обработчик сообщения об изменении текущей вкладки. Делал текущую вкладку невидимой, а видимой ту, которая выбрана, используя метод ShowWindow(SW_HIDE/SW_SHOWNORMAL).

Все замечательно работало, такая конструкция позволяет делать и вложенные вкладки, т.е. когда одна из вкладок сама содержит СTabCtrlEnhanced.

в качестве примера привожу старую картинку, нашел в почте (не обращайте вмнимание на вырвиглазную цветовую тему Windows у клиента).
Нажмите для просмотра прикрепленного файла
nice_vladi
Цитата(alexunder @ Dec 25 2017, 15:06) *
Когда-то у меня был проект на MFC с вкладками, уже в то время можно было все сделать на Windows Forms из .NET, но клиент хотел совместимость с Windows 98 посему пришлось ваять на MFC. СTabCtrl - я так понял это пустышка, нужно все делать ручками. В общем, у меня был новый класс СTabCtrlEnhanced : СTabCtrl. В него добавил массив типа CDialog - диалогов для каждой вкладки соответственно и два новых метода:
InitializeTabs() - для инициализации диалогов вкладок, вызывается один раз родителем.
OnTcnSelchange() - обработчик сообщения об изменении текущей вкладки. Делал текущую вкладку невидимой, а видимой ту, которая выбрана, используя метод ShowWindow(SW_HIDE/SW_SHOWNORMAL).

Все замечательно работало, такая конструкция позволяет делать и вложенные вкладки, т.е. когда одна из вкладок сама содержит СTabCtrlEnhanced.
...


У меня реализовано примерно так же. Для каждой вкладки (Tab) создан свой CDialog. И переключение производится ручками - show/hide. Единственное - я не создавал отдельный класс для вкладок.

И вкладывая CTabCtrl в один из созданных диалогов наблюдал проблему, описанную в пером посте.

Обязательно попробую ваш вариант, может быть, это поможет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.