Перейти к содержанию
    

CTabCtrl Visual Studio 2013

Всем привет!

 

Делаю графическое приложение в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы что, на MFC в 2017 году пишите? :krapula: .NET освоить быстрее, чем один единственный срайный табктрл

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы что, на MFC в 2017 году пишите? :krapula: .NET освоить быстрее, чем один единственный срайный табктрл

 

Оффтоп:

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

 

По делу:

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

 

res.jpg

 

Решения проблемы так и не нашлось. Буду очень благодарен тому, кто объяснит такое поведение программы :smile3046:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда-то у меня был проект на MFC с вкладками, уже в то время можно было все сделать на Windows Forms из .NET, но клиент хотел совместимость с Windows 98 посему пришлось ваять на MFC. СTabCtrl - я так понял это пустышка, нужно все делать ручками. В общем, у меня был новый класс СTabCtrlEnhanced : СTabCtrl. В него добавил массив типа CDialog - диалогов для каждой вкладки соответственно и два новых метода:

InitializeTabs() - для инициализации диалогов вкладок, вызывается один раз родителем.

OnTcnSelchange() - обработчик сообщения об изменении текущей вкладки. Делал текущую вкладку невидимой, а видимой ту, которая выбрана, используя метод ShowWindow(SW_HIDE/SW_SHOWNORMAL).

 

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

 

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

post-19987-1514211140_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда-то у меня был проект на 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...