Цвета страниц TabStrip в Win2000/XP

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Цвета страниц TabStrip в Win2000/XP

Сообщение $Yastrebov$ » 22.03.2008 (Сб) 3:21

TabStrip имеет системный цвет BackColor, который мне не удалось отыскать в таблице цветов VB.
При смене стиля Win2000/XP, TabStrip меняет свой BackColor с серого на белый. Как осуществить замену цвета и для его страниц?
Сами страницы созданы из PictureBox и Frames.
Спасибо!
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 22.03.2008 (Сб) 13:17

Для контролов типа TabStrip предумотрена целая таблица картинок для отрисовки каждой его части. И цвет вкладки не является монотоннным.

просто так поменять цвет, чтобы получить контрол в xP стиле, не получится. Нужно либо отрисовать его заново, или хотя бы добавить манифест к *.exe файлу и вызвать функцию Initcommoncontrols в Sub Main до загрузки основной формы.


Код: Выделить всё
Public Type tagInitCommonControlsEx
   lngSize As Long
   lngICC As Long
End Type


Public Declare Function InitCommonControlsEx Lib "comctl32.dll" (iccex As tagInitCommonControlsEx) As Boolean
Public Const ICC_USEREX_CLASSES = &H200
' INITCOMMONCONTROLSEX_TYPE dwICC-Konstanten
Public Const ICC_ANIMATE_CLASS = &H80 ' Animate-Klasse
Public Const ICC_BAR_CLASSES = &H4 ' StatusBar-, TrackBar- und Toolbar- Klassen
Public Const ICC_COOL_CLASSES = &H400 ' Rebar-Klasse
Public Const ICC_DATE_CLASSES = &H100 ' Date- und TimePicker-Klassen
Public Const ICC_HOTKEY_CLASS = &H40 ' Hotkey-Klasse
Public Const ICC_INTERNET_CLASSES = &H800 ' IP-Adress-Klasse
Public Const ICC_LISTVIEW_CLASSES = &H1 ' Listview-Klasse
Public Const ICC_PAGESCROLLER_CLASS = &H1000 ' Page-Klasse
Public Const ICC_PROGRESS_CLASS = &H20 ' ProgressBar-Klasse
Public Const ICC_TAB_CLASSES = &H8 ' Tab- und Tooltip-Klassen
Public Const ICC_TREEVIEW_CLASSES = &H2 ' Treeview- und Tooltip-Klassen
Public Const ICC_UPDOWN_CLASS = &H10 ' Up-Down-Klasse
Public Const ICC_WIN95_CLASSES = &HFF


Sub Main()

On Error Resume Next
Dim iccex As tagInitCommonControlsEx
With iccex
    .lngSize = LenB(iccex)
    .lngICC = ICC_USEREX_CLASSES
   


End With

Call InitCommonControlsEx(iccex)


On Error GoTo 0

Form1.Show
End Sub

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Сообщение $Yastrebov$ » 22.03.2008 (Сб) 13:44

Alexanbar писал(а):или хотя бы добавить манифест к *.exe файлу и вызвать функцию Initcommoncontrols в Sub Main до загрузки основной формы


Alexanbar, так манифест есть. Проблема не в том, как поменять BackColor у TabStrip (это сделает за меня стиль XP), а в том, чтобы Frames и PictureBoxes меняли цвет вслед за TabStrip на такой же или максимально приблеженный.

Как показано у меня во вложении (картинка), то в случае, когда Frame1 - серый при стиле XP, он не сочетается с белым фоном TabStrip. Если же Frame1 сделать белым, то при стиле Win2000, TabStrip останется серым, а Frame на нем будет белым.
Вложения
777.PNG
Иллюстрация
777.PNG (11.42 Кб) Просмотров: 1395
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 22.03.2008 (Сб) 17:59

Тогда нужно отрисовывать тему "Tab" на Picturebox и вручную отрисовывать Frame с учётом того, на чём он сидит.
Еще раз: у Tabstrip НЕТ ЦВЕТА при использовании тем XP

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 22.03.2008 (Сб) 18:10

А не проще Frame'y BackColor = vbWhite на ХР и &H8000000F& на 2000? И PictureBox'y то же самое задать...

Вроде похоже получается...
Подпись проходит рефакторинг

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 22.03.2008 (Сб) 19:30

Проще, но цвет фрейма и picturebox будет отличаться от tabstrip.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.03.2008 (Сб) 19:41

Lumen
Не проще - на теме SuperPuperFisherman фон таба будет не монотонно белым, а с изображением рыбок. И что тогда?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 22.03.2008 (Сб) 21:25

Хакер писал(а):Lumen
Не проще - на теме SuperPuperFisherman фон таба будет не монотонно белым, а с изображением рыбок. И что тогда?


Вот и я об этом толкую. Не белый он. Цвет меняется в зависимости от координаты точки.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 23.03.2008 (Вс) 12:48

Эм. А EnableThemeDialogTexture уже не в моде, что-ли?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Сообщение $Yastrebov$ » 23.03.2008 (Вс) 16:38

BV писал(а):Эм. А EnableThemeDialogTexture уже не в моде, что-ли?


BV, спасибо. Похоже на правду...
Пример применения имеется?!
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 23.03.2008 (Вс) 20:35

Пример применения имеется?!


Функция элементарная, какой еще пример?
Просто при создании окна-страницы делай:

Код: Выделить всё
EnableThemeDialogTexture(hWndPage, ETDT_ENABLETAB);


Правда, я не уверен, будет ли это работать для элементов управления VB.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Сообщение $Yastrebov$ » 23.03.2008 (Вс) 21:08

BV писал(а):
Пример применения имеется?!


Функция элементарная, какой еще пример?
Просто при создании окна-страницы делай:

Код: Выделить всё
EnableThemeDialogTexture(hWndPage, ETDT_ENABLETAB);


Правда, я не уверен, будет ли это работать для элементов управления VB.


Код: Выделить всё
Private Declare Function EnableThemeDialogTexture Lib "uxtheme.dll" (ByVal hWnd As Long, ByVal dwFlags As Long) As Long

Call EnableThemeDialogTexture(Form1.Picture1.hWnd, ETDT_ENABLE)


Вот это не работает!!!
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.03.2008 (Вс) 21:57

$Yastrebov$
ETDT_ENABLE определена? Где?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Сообщение $Yastrebov$ » 23.03.2008 (Вс) 22:01

Хакер писал(а):$Yastrebov$
ETDT_ENABLE определена? Где?


Да, в General
Private Const ETDT_ENABLE = &H2
Private Const ETDT_ENABLETAB = &H6

Только ничего не выходит(((( Как же его заставить?!
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 23.03.2008 (Вс) 22:27

BV писал(а):
Пример применения имеется?!


Функция элементарная, какой еще пример?
Просто при создании окна-страницы делай:

Код: Выделить всё
EnableThemeDialogTexture(hWndPage, ETDT_ENABLETAB);


Правда, я не уверен, будет ли это работать для элементов управления VB.


Запросто может не работать. Listview из комплекта vb6 много чего игнорирует.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Сообщение $Yastrebov$ » 23.03.2008 (Вс) 22:39

Значит, про EnableThemeDialogTexture стоит забыть. :?

Обыскав И-нет вдоль и поперек, я наткнулся лишь на один рабочий пример, в котором Page от TabStrip полность принимает его стиль на Win2000/XP/Vista. Только код невероятно громоздкий. Может его можно как-то упростить?

Пример, во вложении.
Вложения
TabStripTheme.zip
(21.43 Кб) Скачиваний: 106
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 75

    TopList