Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > таб контрол "внутри" таб контрола


Автор: 0x07L 26.11.2006, 20:19
Есть диалог, в диалоге - два таб контрола и кнопка. Кнопка и один из таб контролов помещены на другой таб контрол. Проблема в том, что внутренний таб контрол не отображается. Замечу, внутренний таб контрол и кнопка не перекрываются.

Содержимое файла ресурсов
Код

IDD_MAIN DIALOGEX 0, 0, 186, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "",IDC_EXTERNAL_TAB,"SysTabControl32",0x0,6,6,174,78
    CONTROL         "",IDC_INTERNAL_TAB,"SysTabControl32",0x0,12,24,156,30
    PUSHBUTTON      "Button1",IDC_INTERNAL_BTN,12,60,50,14
END

При запуске программы кнопка и внутренний таб контрол оказываются ПОД внешним таб контролом, что однако не мешает отображаться кнопке. Как сделать, чтобы отображался и внутренний таб контрол?

Если поменять порядок контролов в файле ресурсов, поместив внутренний таб перед внешним, то он будет отображаться, но мы будем иметь кривой таб ордер. Мне бы хотелось, чтобы было [внешний таб] --> [внутренний таб] --> [кнопка]. В последнем же случае внутренний таб будет идти перед внешним.

Делать внутренний таб потомком внешнего тоже не хотелось бы, поскольку во внутреннем табе будут размещены контролы, а WM_NOTIFY и прочая таб-родитель моему диалогу пересылать не будет (проверено). Между тем "архитектура приложения" ( smile ) требует, чтобы сообщения от контролов обрабатывал диалог. К тому же, почему то внешний таб в этом случае выпадает из таб ордера (при установке стиля WS_EX_CONTROLPARENT).

Итак, как добиться отображения таб контрола, сохранив при этом таб ордер, который я хочу? Возможно ли это? Если нет, может стоит забить на таб ордер?

Варианты кодирования собственного таб ордера с помощью хуков на нажатие клавиши Tab просьба не предлагать. Муторно это и программа того не стОит

Автор: Earnest 27.11.2006, 16:42
Может, транспарент поможет? Кнопка-то небось стиль defaultButton получает (если она пока одна), вот и рисуется поверх еще раз.
Но вообще как-то криво. Я бы все же сделала внутренний таб и кнопку дитем внешнего, а сообщения просто транслировала. Всего то OnCommand и OnNotify переопределить. Или забить на Таб-ордер - вообще сделай внешний таб не таб-стоп - какой смысл? Кстати, контролы чьи дети будут? Если хочешь сделать что-то типа расширенного блокнота, то удобнее контролы распихивать по отдельным окнам (ресурсам).

И зачем тебе понадобился таб в табе? По-моему, не очень это красиво будет смотреться.

Автор: 0x07L 27.11.2006, 23:03
Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
транспарент поможет?
Нет, WS_EX_TRANSPARENT не помогает smile 

Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
Кнопка-то небось стиль defaultButton получает (если она пока одна), вот и рисуется поверх еще раз
Да, действительно, если добавить в диалог еще кнопку (в таб ордере перед той, которая внутри таба), то внутренняя кнопка сначала не отрисовывается, а отрисовывается только тогда, когда получает фокус smile

Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
Всего то OnCommand и OnNotify переопределить
Это если MFC использовать, в Win32 придется субклассить, что, в общем, не проблема. Проблема в таб ордере.

Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
вообще сделай внешний таб не таб-стоп - какой смысл?
Чтобы между закладками можно было переключаться с помощью клавиатуры. Или для этого есть еще какой-то способ?

Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
Кстати, контролы чьи дети будут?
Те, которые внутри внутреннего диалога? Я бы хотел, чтобы они были детьми диалога (чтоб не субклассить лишний раз и хук на ставить)

Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
удобнее контролы распихивать по отдельным окнам (ресурсам)
Да, я чувствую, жутко неудобно будет такие, как мой, диалоги в редакторе ресурсов изменять. C другой стороны, сообщения транслировать придется. Проблему таб ордера это не снимает

Цитата(Earnest @  27.11.2006,  17:42 Найти цитируемый пост)
не очень это красиво будет смотреться
Единственная достойная альтернатива такой конструкции (на мой взгляд) - многоуровневые меню, что для моего случае не очень подходит

Автор: Earnest 28.11.2006, 08:37
Цитата(0x07L @  28.11.2006,  00:03 Найти цитируемый пост)
Да, я чувствую, жутко неудобно будет такие, как мой, диалоги в редакторе ресурсов изменять

Просто проклянешь все на свете. Думай заранее о технологичности поддержки.
Я такое однажды имела, правда не в С++, но сути это не меняло... Получила в наследство. Сначала маялась, потом нафиг переделала, хоть пришлось попотеть... Но зато наступило щастье... 

Ты когда-нибудь такое видел - таб в табе? И не стоит думать, что твоя задача супер-уникальная.

Что за задача-то? 
Альтернатива всегда есть... Внешний таб можно заменить, скажем, деревом... с любым уровнем вложения...
Ведь подумай, все закладки видны всегда, и, значит, здорово загромождают интерфейс... А нафига? Пользователь-то за один раз работает с одной страницей. 

Кстати, если хочешь, чтобы контролы были детьми диалога, совсем не обязательно их сразу в диалог пихать. Все равно проще создать отдельные ресурсы, а потом, подгрузив ресурс, скопировать из него контролы в диалог. Код, конечно, придется пописать, но это один раз... 
Хотя дочерние вложенные диалоги у меня всегда нормально (в смысле таб-ордера) себя вели... 


Автор: 0x07L 28.11.2006, 09:58
Делаем на занятиях программу для работы с изображениями: для наложения фильтров, подавления шума и пр. Во внешнем табе будут вкладки "Наложение фильтров", "Подавление шума" и т.д., во внутреннем табе - либо вкладки с названиями фильтров, либо со способами подавления. Табы я выбрал потому что

1) Сразу видна вся функциональность

2) Они не занимают много места, что важно, ведь мне и изображения (две штуки - исходное и результат) нужно куда-то засунуть, и гистограммы должны быть постоянно видны

Рассматривал также вариант, когда маленькие диаложики с фильтром или подавителем шума появляются по нажатию соответствующих пунктов меню, но это мне не понравилось по пункту 1

Что же касается варинта с деревом, то он, пожалуй, больше места на диалоге будет требовать, хотя ненамного. Так что, если с таб ордером ничего не выйдет, буду использовать такой способ

Автор: Earnest 28.11.2006, 10:19
Если вариантов немного, и вложенность только двухуровневая, используй комбобокс вместо внешнего таба.
Гораздо проще, чем дерево, и места почти не занимает.
Кроме всего прочего, интерфейс должен быть стандартным, тем более, если это учебная задача.

Автор: 0x07L 28.11.2006, 10:29
Да, это хорошее решение. Спасибо большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)