Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> таб контрол "внутри" таб контрола, не хочет отображаться, хотя должен 
V
    Опции темы
0x07L
Дата 26.11.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



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

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

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 просьба не предлагать. Муторно это и программа того не стОит

Это сообщение отредактировал(а) 0x07L - 26.11.2006, 20:36

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Untitled.jpg 45,70 Kb
PM MAIL   Вверх
Earnest
Дата 27.11.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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

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


--------------------
...
PM   Вверх
0x07L
Дата 27.11.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Цитата(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 Найти цитируемый пост)
не очень это красиво будет смотреться
Единственная достойная альтернатива такой конструкции (на мой взгляд) - многоуровневые меню, что для моего случае не очень подходит
PM MAIL   Вверх
Earnest
Дата 28.11.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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

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

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

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

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




--------------------
...
PM   Вверх
0x07L
Дата 28.11.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



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

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

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

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

Что же касается варинта с деревом, то он, пожалуй, больше места на диалоге будет требовать, хотя ненамного. Так что, если с таб ордером ничего не выйдет, буду использовать такой способ
PM MAIL   Вверх
Earnest
Дата 28.11.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
0x07L
Дата 28.11.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Да, это хорошее решение. Спасибо большое!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0697 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.