Стиль отображения применяется не для всех типов объектов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Стиль отображения применяется не для всех типов объектов

Сообщение visualman » 23.03.2012 (Пт) 16:28

Приветствую! Проблема такая. Юзаю InitCommonControlsEX c флагами ICC_BAR_CLASSES и ICC_COOL_CLASSES. СтатусБар и Ребар отображаются правильно, а вот ToolBar стиль не хавает. На скриншоте видно, от серый. Манифест естественно имею (встроен в exe).

Куда копать? Спасибо!
Вложения
Screen.jpg
Screen.jpg (34.99 Кб) Просмотров: 862
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Стиль отображения применяется не для всех типов объектов

Сообщение alibek » 23.03.2012 (Пт) 16:38

Common Controls пятой версии или шестой?
Lasciate ogni speranza, voi ch'entrate.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Стиль отображения применяется не для всех типов объектов

Сообщение visualman » 23.03.2012 (Пт) 16:41

alibek писал(а):Common Controls пятой версии или шестой?

6АЯ
Юзаю так:
Код: Выделить всё
Private Const ICC_BAR_CLASSES = &H4
Private Const ICC_COOL_CLASSES = &H400

Private Type tagInitCommonControlsEx
    lngSize As Long
    lngICC As Long
End Type

Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (iccex As tagInitCommonControlsEx) As Boolean

Dim iccex As tagInitCommonControlsEx
   
With iccex
        .lngSize = LenB(iccex)
        .lngICC = ICC_BAR_CLASSES Or ICC_COOL_CLASSES
End With

InitCommonControlsEx iccex
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Стиль отображения применяется не для всех типов объектов

Сообщение visualman » 23.03.2012 (Пт) 16:51

А может это быть потому что Rebar у меня сделан классом, назначаю ему парента (форму), инициализирую Rebar и потом уже встраиваю туда тулбары???

InitCommonControlsEx вызывается до этих действий, в самом начале Sub Main
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

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

Re: Стиль отображения применяется не для всех типов объектов

Сообщение Хакер » 23.03.2012 (Пт) 18:18

Тулбар стиль хавает.
Прочитай, зачем нужен InitCommonControlsEx, хотя это не относится к делу.

6 версия comctl32.dll поддерживает стили, в отличие от 5-ой, но 6 версия comctl32.ocx не является обёрткой над comctl32.dll по части реализации тулбара (но является обёрткой по части реализации ребара), в отличие от 5-ой.
Поэтому нужно использовать 5-ую версию OCX (достигается её выбором в диалоге Components) и 6-ую версию DLL (достигается манифестом).

Но даже после этого ты будешь наблюдать то, что ты наблюдаешь. Причина вот в чём:
layers.png
layers.png (15.22 Кб) Просмотров: 849

Вот этот контейнер-обёртка, внутри которого лежит тулбар, он плевать хотел на стиль, и он не будет прозрачен, и поэтому даже с учётом того, что тулбар прозрачен и должен просвечивать градиентный фон ребара, контейнер всё портит.

Решение: создавать тулбар минуя OCX-обёртку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Стиль отображения применяется не для всех типов объектов

Сообщение bon818 » 24.03.2012 (Сб) 2:43

http://support.microsoft.com/kb/884883
Во время работы в приложении, которое загружает обе версии (5 и 6) файла Comctl32.dll на компьютере под управлением Microsoft Windows XP, это приложение может перестать отвечать, и в файле Comctl32.dll может произойти нарушение прав доступа.

Примечание. Данная проблема может также сопровождаться отображением окон смешанных стилей. Если приложение использует файл Comctl32.dll версии 6, то в нем отображается окно стиля Windows XP (Comctl32 версии 6). Однако в случае возникновения данной проблемы в приложении может отображаться и окно стиля Windows XP, и окно классического стиля Windows (Comctl32 версии 5).


Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в разделе «Информация в данной статье применима к».

Попробуй наложить фон так
вместо Picture1.hDC hDC ToolBarА ну естествено Paint ловить
Код: Выделить всё
Option Explicit

Private Type RECT2
    x1 As Long
    y1 As Long
    x2 As Long
    y2 As Long
End Type

'Theme =========================================================================
Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT2) As Long
Private Declare Function DrawThemeBackGround Lib "uxtheme.dll" Alias "DrawThemeBackground" (ByVal hTheme As Long, ByVal lhdc As Long, ByVal iPartId As Long, ByVal iStateId As Long, pRect As RECT2, pClipRect As Any) As Long
Private Declare Function OpenThemeData Lib "uxtheme.dll" (ByVal hwnd As Long, ByVal pszClassList As Long) As Long
Private Declare Function CloseThemeData Lib "uxtheme.dll" (ByVal hTheme As Long) As Long


Private Sub SusTheme(wParam As Long)
    Dim hTheme  As Long, uRct     As RECT2
    GetClientRect wParam, uRct
    hTheme = OpenThemeData(0&, StrPtr("ReBar"))
    If (hTheme) Then
        Call DrawThemeBackGround(hTheme, Picture1.hDC, 6, 0&, uRct, ByVal 0&)
        Call CloseThemeData(hTheme)
    Else
       Picture1.BackColor = Picture1.BackColor
    End If
End Sub

Private Sub Form_Paint()
Call SusTheme(Picture1.hwnd)
End Sub




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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 74

    TopList