реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> CTabCtrl Visual Studio 2013, Зависание при смене фокуса
nice_vladi
сообщение Dec 11 2017, 09:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Всем привет!

Делаю графическое приложение в 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. Корявое решение, при работе с этими вкладками постоянно теряется фокус окна. Ничего лучше не придумал. Проблема не решена, это временный костыль.


Сообщение отредактировал nice_vladi - Dec 11 2017, 13:57
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 11 2017, 20:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Вы что, на MFC в 2017 году пишите? krapula.gif .NET освоить быстрее, чем один единственный срайный табктрл
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Dec 12 2017, 03:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Цитата(DASM @ Dec 11 2017, 21:56) *
Вы что, на MFC в 2017 году пишите? krapula.gif .NET освоить быстрее, чем один единственный срайный табктрл


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

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



Решения проблемы так и не нашлось. Буду очень благодарен тому, кто объяснит такое поведение программы smile3046.gif
Go to the top of the page
 
+Quote Post
alexunder
сообщение Dec 25 2017, 14:06
Сообщение #4


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



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

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

в качестве примера привожу старую картинку, нашел в почте (не обращайте вмнимание на вырвиглазную цветовую тему Windows у клиента).
Прикрепленное изображение


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Dec 26 2017, 05:52
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Цитата(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 в один из созданных диалогов наблюдал проблему, описанную в пером посте.

Обязательно попробую ваш вариант, может быть, это поможет.

Сообщение отредактировал nice_vladi - Dec 26 2017, 05:53
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 13:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.04988 секунд с 7
ELECTRONIX ©2004-2016