nice_vladi 2 11 декабря, 2017 Опубликовано 11 декабря, 2017 (изменено) · Жалоба Всем привет! Делаю графическое приложение в 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. Корявое решение, при работе с этими вкладками постоянно теряется фокус окна. Ничего лучше не придумал. Проблема не решена, это временный костыль. Изменено 11 декабря, 2017 пользователем nice_vladi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 11 декабря, 2017 Опубликовано 11 декабря, 2017 · Жалоба Вы что, на MFC в 2017 году пишите? :krapula: .NET освоить быстрее, чем один единственный срайный табктрл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 12 декабря, 2017 Опубликовано 12 декабря, 2017 · Жалоба Вы что, на MFC в 2017 году пишите? :krapula: .NET освоить быстрее, чем один единственный срайный табктрл Оффтоп: Да, MFC. Вообще, мне больше Qt импонирует) Но досталась поддержка проекта, писанного не мной, писанного кривовато, и писанного в Visual Studio + MFC. Так что деваться некуда, приходится учиться. По делу: Кстати, все-таки выбросил Tab1 из вкладки Tab0 и добавил все вкладки из Tab1 в Tab0. Пояснение прикрепил в виде схемы (Вариант 2 - текущий вариант). Однако Вариант 1 мне нравится больше. Но в таком виде зависание программы, описанное в стартовом сообщении. Решения проблемы так и не нашлось. Буду очень благодарен тому, кто объяснит такое поведение программы :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 25 декабря, 2017 Опубликовано 25 декабря, 2017 · Жалоба Когда-то у меня был проект на MFC с вкладками, уже в то время можно было все сделать на Windows Forms из .NET, но клиент хотел совместимость с Windows 98 посему пришлось ваять на MFC. СTabCtrl - я так понял это пустышка, нужно все делать ручками. В общем, у меня был новый класс СTabCtrlEnhanced : СTabCtrl. В него добавил массив типа CDialog - диалогов для каждой вкладки соответственно и два новых метода: InitializeTabs() - для инициализации диалогов вкладок, вызывается один раз родителем. OnTcnSelchange() - обработчик сообщения об изменении текущей вкладки. Делал текущую вкладку невидимой, а видимой ту, которая выбрана, используя метод ShowWindow(SW_HIDE/SW_SHOWNORMAL). Все замечательно работало, такая конструкция позволяет делать и вложенные вкладки, т.е. когда одна из вкладок сама содержит СTabCtrlEnhanced. в качестве примера привожу старую картинку, нашел в почте (не обращайте вмнимание на вырвиглазную цветовую тему Windows у клиента). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 26 декабря, 2017 Опубликовано 26 декабря, 2017 (изменено) · Жалоба Когда-то у меня был проект на MFC с вкладками, уже в то время можно было все сделать на Windows Forms из .NET, но клиент хотел совместимость с Windows 98 посему пришлось ваять на MFC. СTabCtrl - я так понял это пустышка, нужно все делать ручками. В общем, у меня был новый класс СTabCtrlEnhanced : СTabCtrl. В него добавил массив типа CDialog - диалогов для каждой вкладки соответственно и два новых метода: InitializeTabs() - для инициализации диалогов вкладок, вызывается один раз родителем. OnTcnSelchange() - обработчик сообщения об изменении текущей вкладки. Делал текущую вкладку невидимой, а видимой ту, которая выбрана, используя метод ShowWindow(SW_HIDE/SW_SHOWNORMAL). Все замечательно работало, такая конструкция позволяет делать и вложенные вкладки, т.е. когда одна из вкладок сама содержит СTabCtrlEnhanced. ... У меня реализовано примерно так же. Для каждой вкладки (Tab) создан свой CDialog. И переключение производится ручками - show/hide. Единственное - я не создавал отдельный класс для вкладок. И вкладывая CTabCtrl в один из созданных диалогов наблюдал проблему, описанную в пером посте. Обязательно попробую ваш вариант, может быть, это поможет. Изменено 26 декабря, 2017 пользователем nice_vladi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться