Re: Style XP, TabControl и другие...
От: Mika H http://x3dengine.da.ru
Дата: 14.04.04 14:35
Оценка:
Здравствуйте, Shergin, Вы писали:

S>Есть диалог, в нем есть TabControl, на нем есть какой-нибудь другой контрол, например CheckBox или тот же TabContol. Проблема в том, что в XP вкладки TabContol имеют белый цвет, а фон у других элементов управления стандартный (~серый), при их наложении получается некрасиво...

S>Что делать?..

Итак, есть два класса проблем, связанных с TabControl в Windows XP.

1. TabControl создаётся при помощи PropertySheet() см. MSDN. В этом случае (если есть манефест у приложения и не включена классическая тема) у некоторых элементов диалога, отображаемого поверх TabControl'а может наблюдаться серый фон. А может и не наблюдаться. Я не интересовался тем, когда такое случается, а когда нет. Тем не менее вызов EnableThemeDialogTexture(hDlg,6) из библиотеки uxtheme.dll, где в качестве hDlg надо сказать handle диалога, отбражаемого поверх TabControl'а решает все проблемы
(рекомендуется звать EnableThemeDialogTexture при создании hDlg; естественно необходимо звать её для всех отображаемых поверх TabControl'а диалогов).
Да, не забывайте, что EnableThemeDialogTexture отсутствует в старых Windows и необходимо следить за этим.

2. Пожалуй, самая интересная проблема возникает при попытке создания TabControl'а "вручную". Например, из ресурсника через CreateDialog. Как известно, в этом случае (при условии theming'a) EnableThemeDialogTexture() уже не спасает: градиенты у TabControl'а и у диалога, для которого была вызвана EnableThemeDialogTexture() отличаются, хотя и не очень сильно. Т.е. от использования EnableThemeDialogTexture() приходится отказаться. Но в этом случае необходимо красить фон диалога и его static'ов нужнной кисточкой, чтобы цвет согласовывался с градиентным фоном TabControl'а.

Решение этой проблемы предложено тут.
А так же можно использрвать вот этот вариант.

Но на этом проблемы не закончились. В обоих решениях будет наблюдаться глюк: запускаем наше приложение, когда используется theming, после чего переключаем Windows в классическое оформление. Вкладки TabControl'а не меняют свой фон и остаются белыми, в то время как всё остальное выглядит классически серым. Recreating нашего TabContorl'а, как удалось установить экспериментально, спасает не всегда. Однако спасла установка флажкка "Flat Buttons" в TRUE для TabControl'а в редакторе диалогов.

Тем не менее остаются ещё две аналогичные проблемы, связанные с TrackBar'ом и со ScrollBar'ом. Однако, подобные явления наблюдаются даже у PropertyPage и, к тому же, фон TrackBar'а и ScrollBar'а обычно исправляется при нажатии на них. В крайнем случае можно предложить recreating для элементов этого типа.

Если у вас есть предложения лучше или замечания, пишите.

mikas@inbox.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.