powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Градиенты в Vista стиле, и в частности подложка под Toolbar.
39 сообщений из 39, показаны все 2 страниц
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36599703
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача простая.
Есть прямоугольник (picturebox, label), не суть.
У него есть свойство background.
Например я хочу сделать ему горизонтальный градиент в стиле Виста (что-й то типа мутно зеленого, в направлении фиолетового).
Ну т.е.
1) как сделать градиент по горизонтали (вертикали)
2) Ну и какие цвета закладывать под Висту(если кто просто знает)

Ну а на прямоуг. например наложить картинку, текст и т.п., Transparent Control Antonary вроде как любезно предоставил. Пример где полезно: окно About.

Задача посложнее:
Подложка под Toolbar: градиент по вертикали, темно синий или мутно зеленый с преломлением посредине.
По идее накопал слово ToolStrip и вот энтот example
http://www.vbforums.com/showthread.php?t=547618
но думается что ToolStrip это vb.net-наворот, и наверняка можно заказать этот стиль Toolbar-у через API, без ручной рисовки т.е.

Хотелось бы каких-то идей-направлений (хотя бы).
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36600263
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если "Toolbar" - это PictureBox, то тогда всё просто:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
VERSION  5 . 00 
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =    6075 
   ClientLeft      =    120 
   ClientTop       =    420 
   ClientWidth     =    9270 
   LinkTopic       =   "Form1"
   ScaleHeight     =    6075 
   ScaleWidth      =    9270 
   StartUpPosition =    3   'Windows Default
   Begin VB.CommandButton Command1 
      Caption         =   "Command1"
      Height          =    435 
      Left            =    3720 
      TabIndex        =    1 
      Top             =    5520 
      Width           =    1815 
   End
   Begin VB.PictureBox Picture1 
      Height          =    4935 
      Left            =    900 
      ScaleHeight     =    4875 
      ScaleWidth      =    7155 
      TabIndex        =    0 
      Top             =    420 
      Width           =    7215 
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Sub Command1_Click()
    Gradient Picture1,  255 , &H800000,  1 
End Sub

Friend Sub Gradient(ByRef obj As Object, ByVal Color1 As Double, ByVal Color2 As Double, Optional ByVal Orientation As Byte =  1 )
Dim VR As Single, VG As Single, VB As Single
Dim R As Integer, G As Integer, B As Integer, R2 As Integer, G2 As Integer, B2 As Integer
Dim temp As Long, y As Single, x As Single

    temp = (Color1 And  255 )
    R = temp And  255 
    temp = Int(Color1 /  256 )
    G = temp And  255 
    temp = Int(Color1 /  65536 )
    B = temp And  255 
    temp = (Color2 And  255 )
    R2 = temp And  255 
    temp = Int(Color2 /  256 )
    G2 = temp And  255 
    temp = Int(Color2 /  65536 )
    B2 = temp And  255 
    If Orientation =  1  Then
        VR = Abs(R - R2) / obj.ScaleHeight
        VG = Abs(G - G2) / obj.ScaleHeight
        VB = Abs(B - B2) / obj.ScaleHeight
        If R2 < R Then VR = -VR
        If G2 < G Then VG = -VG
        If B2 < B Then VB = -VB
        For y =  0  To obj.ScaleHeight
            R2 = R + VR * y
            G2 = G + VG * y
            B2 = B + VB * y
            obj.Line ( 0 , y)-(obj.ScaleWidth, y), RGB(R2, G2, B2)
        Next y
    Else
        VR = Abs(R - R2) / obj.ScaleWidth
        VG = Abs(G - G2) / obj.ScaleWidth
        VB = Abs(B - B2) / obj.ScaleWidth
        If R2 < R Then VR = -VR
        If G2 < G Then VG = -VG
        If B2 < B Then VB = -VB
        For x =  0  To obj.ScaleWidth
            R2 = R + VR * x
            G2 = G + VG * x
            B2 = B + VB * x
            obj.Line (x,  0 )-(x, obj.ScaleHeight), RGB(R2, G2, B2)
        Next x
    End If
End Sub
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36600420
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Хотелось бы каких-то идей-направлений (хотя бы).NM_CUSTOMDRAW
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36601168
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

за код спасибо, в принципе вчера уже находил нечто подобное.
Gradient Picture1, 7226628, 7698196, 0 'фон
Gradient Picture3, 28663, 53757, 0 'оранжевая полоска под фоном

рисует например чего хочу(для определения крайних цветов взял первую попавшуюся утилиту)

Но я взял другое решение.
Он градиент рисует за ощутимое время, + еще этот контрол прозрачности (не всегда как хотелось бы срабатывает).
Да еще и надо перерисовывать по _paint, чтоб не стиралось
И еще непонятно как это грузит систему...
Проще один раз в тестовом приложении нарисовать желаемое, сделать PrintScreen и сохранить в Bitmap, а Bitmap доставать из ресурсов и показывать (если конечно нет желания чтоб полоска под фоном переливалась цветами). Для About достаточно (лишних 100кб размера exe не особо жалко).

С Toolbar конечно надо повозиться. В принципе гамму цветов можно взять из приведенного мной в начале примера.
NM_CUSTOMDRAW что делает?
Вообще виста думаю должна автоматически это дело подкладывать, если оно заказано.

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

А интересно: только какую-то область формы и только подложку (без скажем кнопки, что на ней нарисована.)
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36601181
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разбирайся:
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36601553
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

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

О! Label оказывается может иметь BackStyle=Transparent без всяких контролов. Не обращал внимания. Пустячок, а приятно.

Только какое это имеет отношение к Вистовскому Toolbar?

По идее он на Висте прозрачный(манифест думаю обеспечивает прозрачность). Можно попробовать подложить под него Picturebox(ну извращаться конечно: Toolbar, в него PictureBox, внутрь еще Toolbar), a Picturebox раскрасить градиентом, ну хоть вашу ф-цию взять чуть рихтануть чтоб с середины высоты градиент шел в обратку...etc
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36601868
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глухо пока...
Пример (очень простой) грамотной подкладки картинки под Toolbar я нашел.
http://www.vbforums.com/showthread.php?t=381167
Но беда в том что он не работает со стилями (т.е. либо не должно быть манифеста, либо XP классика, либо отменяем темы).

Вот например человек мучился, и его "озарило".

http://www.codeproject.com/answers/44511/Changing-Background-colour-of-Toolbar-with-Vista-D.aspx

Только в баню такой тулбар нужен с 98-ми кнопками пусть даже и на фоне эмблемы win7.

Гм, а может тему "explorer" ему тупо забабахать....
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36601951
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение то в общем прозрачно:
To create a transparent toolbar, all you need to do is add TBSTYLE_FLAT or TBSTYLE_TRANSPARENT to the window style parameter of CreateWindowEx.
Там и картинка приводится:
http://msdn.microsoft.com/en-us/library/bb760443(v=VS.85).aspx
С оговоркой правда:
To prevent repainting problems, this style should be set before the toolbar control becomes visible.


Казалось бы
Код: plaintext
1.
2.
3.
4.
hTBar = FindWindowEx(Toolbar1.hwnd,  0 &, "ToolbarWindow32", vbNullString)
lngStyle = SendMessage(hTBar, TB_GETSTYLE,  0 &, ByVal  0 &)
lngStyle = lngStyle Or TBSTYLE_FLAT Or TBSTYLE_TRANSPARENT  '
' Set the new style
Call SendMessage(hTBar, TB_SETSTYLE,  0 &, ByVal lngStyle)
а вот не работает.

Видимо ocx производит какие-то repainting problems.
Когда возился с VB-treeview, пришлось подыграть начальными установками чтоб добиться применения доп.стилей как хотел.
Здесь видимо аналогично.
Не уверен что хочу API-тулбар, но взглянуть взглянул бы.

CreateWindowEx или CreateToolbarEx примеров на vb простых не нашел.

Здесь есть
http://msdn.microsoft.com/en-us/library/bb760446(v=VS.85).aspx
но это надо напрягаться, хотелось бы что то простое именно на VB (хочу увидеть TBSTYLE_TRANSPARENT). Но именно простое а не собрание сочинений VB-автора в 40томах (читай user-control-ах и т.п.)
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36602525
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот когда то давно по чужому примеру допиливал свой тулбар, есть кое какие баги конечно, но может что-то и пригодится.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36602710
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
ну, ругается на kpToolbar.ocx, вроде как ее скомпилировал и зарегистрировал, но все равно не работает, даже чтоб посмотреть, неохота изучать собрание сочинений.
Я тут все же рискнул "перевести" (в смысле самостоятельно, без примеров ибо не нашел достойных) microsoft-овский код с CreateWindowEx в лоб что называется.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
Option Explicit

Private Const TOOLBAR_CLASS = "ToolBarWindow32"
Private Const WS_CHILD = &H40000000 _
'Makes it a child of our parent window
Private Const CW_USEDEFAULT = &H80000000

' Toolbar constants
Private Const WM_USER = &H400
Private Const TBSTYLE_FLAT As Long = &H800
Private Const TBSTYLE_TRANSPARENT = &H8000&
Private Const TB_SETSTYLE = WM_USER +  56 
Private Const TB_GETSTYLE = WM_USER +  57 
Private Const TB_SETIMAGELIST = WM_USER +  48 
Private Const TB_SETHOTIMAGELIST = WM_USER +  52 
Private Const TB_SETDISABLEDIMAGELIST = WM_USER +  54 
Private Const TB_LOADIMAGES = WM_USER +  50 
'Private Const TBSTYLE_TRANSPARENT As Long = &H8000
Private Const TBSTYLE_WRAPABLE = &H200

Private Const TB_AUTOSIZE = (WM_USER +  33 )
Private Const TB_BUTTONSTRUCTSIZE = (WM_USER +  30 )
Private Const TB_ADDBUTTONS = (WM_USER +  20 )
Private Const TB_GETBUTTONINFOW = (WM_USER +  63 )
Private Const TB_SETBUTTONINFOW = (WM_USER +  64 )
Private Const TB_GETBUTTONINFOA = (WM_USER +  65 )
Private Const TB_SETBUTTONINFOA = (WM_USER +  66 )
#If UNICODE Then
Private Const TB_GETBUTTONINFO = TB_GETBUTTONINFOW
Private Const TB_SETBUTTONINFO = TB_SETBUTTONINFOW
#Else
Private Const TB_GETBUTTONINFO = TB_GETBUTTONINFOA
Private Const TB_SETBUTTONINFO = TB_SETBUTTONINFOA
#End If

Private Const TBSTATE_ENABLED = &H4
Private Const TBSTYLE_BUTTON = &H0

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
  (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, _
  ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, _
  ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, _
  lpParam As Any) As Long

' ImageList_Create flags
Private Const ILC_MASK = &H1

Private Const ILC_COLOR = &H0
Private Const ILC_COLOR4 = &H4
Private Const ILC_COLOR8 = &H8
Private Const ILC_COLOR16 = &H10
Private Const ILC_COLOR24 = &H18
Private Const ILC_COLOR32 = &H20

Private Declare Function ImageList_Create Lib "comctl32.dll" (ByVal Cx As Long, ByVal cy As Long, ByVal flags As Long, ByVal cInitial As Long, ByVal cGrow As Long) As Long
Private Declare Function ImageList_Destroy Lib "comctl32.dll" (ByVal himl As Long) As Boolean
Private Declare Function ImageList_ReplaceIcon Lib "comctl32.dll" (ByVal himl As Long, ByVal i As Long, ByVal hIcon As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lparam As Any) As Long

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lparam As Long) As Long

'Standard image types:
Private Const IDB_STD_SMALL_COLOR =  0 
Private Const IDB_STD_LARGE_COLOR =  1 
Private Const IDB_VIEW_SMALL_COLOR =  4 
Private Const IDB_VIEW_LARGE_COLOR =  5 
Private Const IDB_HIST_SMALL_COLOR =  8 
Private Const IDB_HIST_LARGE_COLOR =  9 

Private Const HINST_COMMCTRL = - 1 &

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd _
    As Long, ByVal nCmdShow As Long) As Long

Private Const SW_HIDE =  0 &
Private Const SW_SHOWNORMAL =  1 &

Private Type TBBUTTONINFO
    cbSize As Long
    dwMask As Long
    idCommand As Long
    iImage As Long
    fsState As Byte
    fsStyle As Byte
    Cx As Integer 'Not Long
    lparam As Long
    pszText As String
    cchText As Long
End Type
Private Type TBBUTTON
   iBitmap      As Long
   idCommand    As Long
   fsState      As Byte
   fsStyle      As Byte
   bReserved1   As Byte
   bReserved2   As Byte
   dwData       As Long
   iString      As Long
End Type

Sub CreateToolbar()
    Dim hWndToolbar As Long
    Dim hWndIml As Long
    Dim tbb As TBBUTTON
    Dim i As Integer
    ' Create the toolbar.
    hWndToolbar = CreateWindowEx( 0 &, _
      TOOLBAR_CLASS, _
      vbNullString, _
      WS_CHILD Or TBSTYLE_WRAPABLE Or TBSTYLE_FLAT Or TBSTYLE_TRANSPARENT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      Form1.hwnd, _
       0 &, _
      App.hInstance, _
       0 &)
      
     '
      
    'Create the imagelist.
    hWndIml = ImageList_Create( 12 ,  12 , ILC_MASK Or ILC_COLOR32,  3 ,  0 ) '
    ImageList_ReplaceIcon hWndIml, - 1 , Picture1( 0 ).Picture.Handle 'LoadPicture("head3.ico")
    ImageList_ReplaceIcon hWndIml, - 1 , Picture1( 1 ).Picture.Handle 'LoadPicture("head23.ico")
    ImageList_ReplaceIcon hWndIml, - 1 , Picture1( 1 ).Picture.Handle 'LoadPicture("head23.ico")
    
    'Set the image list
    Call SendMessage(hWndToolbar, TB_SETIMAGELIST,  0 , ByVal hWndIml)

    'Load the button images
    Call SendMessage(hWndToolbar, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, HINST_COMMCTRL)
    
    'Initialize button info.
    'IDM_NEW, IDM_OPEN, and IDM_SAVE are application-defined command constants
      
    For i =  0  To  2 
        With tbb
            .idCommand = i ' Change the ID to be whatever you want
            .iBitmap = i ' Change this value to indicate the index of the button icon, or -1 for no icon
            .iString = - 1  ' If your toolbar button needs to display text, you need to send the toolbar a TB_ADDSTRING message and set iString to the value returned
            .fsState = TBSTATE_ENABLED
            .fsStyle = TBSTYLE_BUTTON
        End With
        SendMessage hWndToolbar, TB_ADDBUTTONS,  1 , tbb
    Next i
      
    'Tell the toolbar to resize itself, and show it.
    Call SendMessage(hWndToolbar, TB_AUTOSIZE,  0 ,  0 )
    ShowWindow hWndToolbar, SW_SHOWNORMAL
    'MsgBox hWndIml
End Sub

Private Sub Form_Load()
    CreateToolbar
End Sub

Что могу сказать, TBSTYLE_TRANSPARENT срабатывает- в среде VB. сама Форма под тулбар прозрачная, могу сквозь Toolbar читать текст программы (при старте).
Но потом он не перерисовывается, т.е. захватывает изображение под формой (а не фон формы) первого момента.

А с манифестом вне vb я Toolbar вообще не вижу.

Вообще конечно в идеале надо заставить TBSTYLE_TRANSPARENT работать под vb(ocx) Toolbar-ом.
В крайнем случае Rebar API-шный с картинкой под него подложить.
Нет идей как это сделать (TBSTYLE_TRANSPARENT with ocx control-5 Toolbar)?

Честно склоняюсь к мысли пока на все это вообще забить, через API целиком делать сильно неохота, то что накатал это очевидно только начало причем сильно сырое.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36602724
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, это явно только начало. я кинул пример тулбара, там рисование чистое на hDC происходит. чтоб скомпилилось надо совместимость в проекте убрать, сам ocx не стал кидать из-за размера.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36604294
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать глючно-прозрачным мне OCX-тулбар все же удалось.
'
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Toolbar constants
Private Const WM_USER = &H400
Private Const TBSTYLE_FLAT As Long = &H800
Private Const TB_STYLE_TRANSPARENT As Long = &H8000 '&
Private Sub Form_Load()
    Dim hToolbar As Long
    hToolbar = GetWindow(Toolbar1.hwnd, GW_CHILD)
    'hToolbar = FindWindowEx(Toolbar1.hwnd, 0&, "ToolbarWindow32", vbNullString)
    SetWindowLong hToolbar, GWL_STYLE, GetWindowLong(hToolbar, _
        GWL_STYLE) Or TB_STYLE_TRANSPARENT Or TB_STYLE_FLAT

Фишка в методе и в &H8000 '& без & на конце (другая константа)
Но это ровным счетом ничего не дает.
Дает снимок экрана при запуске в области Toolbar.
По сравнению с API-"методом" дает еще недоступность кнопок: при нажатии звук предупреждения в динамик, как будто форма под msgbox.
На XP/Vista-стиле появляются еще странные крестики "закрытия формы" в правой части "тулбара"

Глючное сие произведение действит. вызывается только лишь если применять все до момента Visible, хоть в чем то Microsoft не обманул.

А как вообще в Висте тулбар устроен? Ощущение, что это вообще не он. Там Rebar я так понимаю, Rebar раскрашен в градиент и на него накидано куча прозрачных кнопочек с менюшками. М б это вообще не тулбар и не туда копаю, потому как если нечто умеет что-то то это можно выжать, а если не умеет то это выжать нельзя. Если в висте так все приложения и делают, значит так и надо сделать, но хотелось бы это понять.

Всякие пользовательские наляпки честно не очень интересуют, хотелось бы делать так как делает система, ибо наляпка обычно хорошо "ляпает" при смене стиля или OS.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36604748
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там вообще не ActiveX (не контрол), там все рисуется методами API
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36605535
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One, я понимаю что винды все рисуют через API а не через (ms)comctl(32).ocx

Там Toolbar? (т.е. в висте, характерных примеров не так много кстати: сам Explorer-зеленый градиент, Почта Windows и Fax and Scan- синий градиент) т.е. вот ЭТО:

http://msdn.microsoft.com/en-us/library/bb760435(v=VS.85).aspx

Или там вообще не ЕТО.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36605546
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скриншот выложи и обведи что ты считаешь тулбаров в виндоусе и что ты хочешь от него
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36605584
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя можешь не выкладывть. просто Spy++ запусти и сам проверь. вот и узнаешь что там за классы окон микрософт юзает.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36605600
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если есть желание порыться в контролах, то вот сюда глянь (Control Spy v2.0)
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36607378
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа если есть желание порыться в контролах, то вот сюда глянь (Control Spy v2.0)
Ну....
в энтом Spy Toolbar на черном фоне красиво выглядит, прям то что надо.
Но вот пытаюсь применить в лоб эти стили, кот. якобы соответствуют тому красивому что Microsoft в Spy рисует:

Хоть к API Toolbar-у
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    ' Create the toolbar.
    hWndToolbar = CreateWindowEx( 0 &, _
      TOOLBAR_CLASS, _
      vbNullString, _
      TBSTYLE_ALTDRAG Or TBSTYLE_FLAT Or TBSTYLE_TOOLTIPS Or TBSTYLE_TRANSPARENT Or _
 TBSTYLE_WRAPABLE Or CCS_TOP Or WS_CHILD Or WS_OVERLAPPED Or WS_VISIBLE, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      Me.hwnd, _
       0 &, _
      App.hInstance, _
       0 &)

Хоть к VB-Toolbar-у
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Const TB_STYLE_TRANSPARENT As Long = &H8000 '&
Private Const TBSTYLE_TRANSPARENT = &H8000&


   < hToolbar = GetWindow(Toolbar1.hwnd, GW_CHILD) >
    SetWindowLong <hToolbar><Toolbar1.hwnd>, GWL_STYLE, <GetWindowLong(hToolbar, GWL_STYLE) Or> _
     TB<_>STYLE_TRANSPARENT Or TBSTYLE_FLAT Or WS_OVERLAPPED Or _
     TBSTYLE_ALTDRAG Or TBSTYLE_FLAT Or _
     TBSTYLE_TOOLTIPS Or TBSTYLE_TRANSPARENT Or TBSTYLE_WRAPABLE Or CCS_TOP Or WS_CHILD _
     Or WS_OVERLAPPED Or WS_VISIBLE
'<> означает "пробовал варианты"

и ничего нового кроме описанных мной выше глюков не наблюдаю.
Мож чего недопонял? А примеров на сию тему...нема. Видимо не я один "недопонял".

Потому как если то чего изображено в SPY реализуемо, то Тулбар просто пихается в API-Rebar (а в примитивном варианте можно и в Coolbar из 6-х контролов), и задача решается.
Вопрос тогда в том как изобразить то что изображает Microsoft в Spy под словом Toolbar по умолчанию (фон формы можно сделать в Spy черным, чтоб понять о чем речь).
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36664411
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

с картинками стало понятнее, но они не отвечают на два ключевых вопроса: 1) какого класса эти окна (мало ли, это самодеятельность какого-нибудь MsoCommandBar или другого несистемного класса) и 2) является ли их закраска тематической. Воспользуйтесь Spy++ и Theme Explorer или аналогами. Кстати, Spy++ (отчасти) открыл бы Вам, что я "повёлся" на Ваше пожелание "доработать" VB-шный Coolbar вставкой в него системного Toolbar (может, напрасно). А добавить любой битмап (в том числе формируемый на лету градиентный) в качестве подложки несложно.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36667621
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

от радости воочию увиденного того, что казалось уже не возможным я даже ничего сразу и не отписал. Сейчас собираюсь вникать, вчера смотрел поверхностно, но сразу возникли себе на уме вопросы:
1) Кулбар вообще обязателен? Лишний контрол+таки лишняя OCX...
2) Мне не удалось убрать "пустую" панель, если ее вычеркнуть в конструкторе, то вообще ничего не отображается.
А из кода через Remove почему-то с ходу не вышло.
3) С VB тулбаром все эти фокусы сделать нельзя?

Бенедикт2) является ли их закраска тематической. Воспользуйтесь Spy++ и Theme Explorer или аналогами.
а ControlSpyV6 и spy++ это не тоже самое?
Theme Explorer Theme Explorer
я что-то не очень понял.
Что они мне дадут?
1) Я должен при помощи этих прог подобрать стиль того чего я хочу методом тыка?
2) Или они мне разложат по косточкам имеющуюся прогу типа Windows Mail и опишут из чего там сделан этот Тулбар?

Первое кажется более реальным, но с ControlSpyV6 только удалось узреть прозрачный тулбар с черной подложкой.
Если второе, то Шариков не догоняет как это делается.

БенедиктКстати, Spy++ (отчасти) открыл бы Вам, что я "повёлся" на Ваше пожелание "доработать" VB-шный Coolbar вставкой в него системного Toolbar (может, напрасно).
Это было не желание, это было высказано от безысходности.
Это кстати я и так догадался, когда у меня Vista OCX затребовала. (Я намеренно не пускаю в смысле не устанавливаю VB на тестовые системы).
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36668156
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) Кулбар вообще обязателен? Лишний контрол+таки лишняя OCX...
Без него не получается, может ребар через API. Но такое ощущение, что он хоть и версии 6, но в отличии от всех остальных контролов-6 темы то поддерживает (полоска или точки в заголовках панелей)
Дмитрий772) Мне не удалось убрать "пустую" панель, если ее вычеркнуть в конструкторе, то вообще ничего не отображается.
А из кода через Remove почему-то с ходу не вышло.
Конфликт API и VB. Убрать ее по-простому нельзя. Но можно сделать visible=false и требуемый эффект "одинокого тулбар" будет достигнут.
Т.к. высота при этом заметно уменьшается, то таки-зазора между кнопками и краями
воспользовался
Dim rbBand As REBARBANDINFO
With rbBand
...
.fStyle = RBBS_NOVERT Or RBBS_CHILDEDGE


Дмитрий773) С VB тулбаром все эти фокусы сделать нельзя?.
Чет не получается. Но и раньше не получалось.

Но конечно вопросов море задаю...

При данном стиле высоту-ширину кнопок лучше увеличивать (как вариант вытянутые по вертикали)
Экспереминтируем...
Код: plaintext
1.
2.
3.
4.
g_hwndToolBar = CreateToolbarEx(hwndParent, _
                    ToolbarStyle, ID_TOOLBAR,  0 , HINST_COMMCTRL, _
                    IDB_STD_SMALL_COLOR, tbButtonsCreate( 0 ), _
                    UBound(tbButtonsCreate) - LBound(tbButtonsCreate) +  1 , _
                     0 ,  0 ,  32 ,  32 , LenB(tbButtonsCreate( 0 )))

По ширине растягивается, по высоте не хочет.

По другому:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Call SendMessage(g_hwndToolBar, TB_SETBUTTONSIZE,  0 , ByVal MAKELPARAM( 32 ,  32 ))
...
 Public Function MAKELPARAM(wLow As Long, wHigh As Long) As Long
   MAKELPARAM = MAKELONG(wLow, wHigh)
 End Function
 Public Function MAKELONG(wLow As Long, wHigh As Long) As Long
   MAKELONG = LOWORD(wLow) Or (&H10000 * LOWORD(wHigh))
 End Function
Function LOWORD(ByVal dw As Long) As Integer
    If dw And &H8000& Then
        LOWORD = dw Or &HFFFF0000
    Else
        LOWORD = dw And &HFFFF&
    End If
End Function
Срабатывает по высоте, но не по ширине.
Но высота самого Тулбар при этом не увеличивается, кнопки срезаются снизу.

По другому:
Код: plaintext
Call SendMessage(g_hwndToolBar, TB_SETBUTTONSIZE,  0 , ByVal MAKELPARAM( 50 ,  32 ))
И по ширине увеличивается.
Какие-то нелинейные зависимости...
==================================
Цветность иконок в Тулбар.
Не могу понять как приложения их "рисуют красиво".
Не далее как вчера копал эту тему, пришел к выводу, что 24-х битных битмап для Тулбара достаточно, для Listview-Treeview я сейчас использую 32-бит иконки с прозрачными тенями...
(дублирую и заменяю bat-файлом в готовом exe)

Проблема в чем. Честно тырятся ресурсы из стандартных прог.
Причем Win прога берет их очевидно из bimap.
Это очевидно потому что я не сумел найти иконки с альфа-каналом картинок требуемого вида, как не искал.
Может какая-то хитрая обработка через gdi делается? в смысле тени/прозрачность как-то кодируются в битмапах(каким то цветом, не маск color а что-то другое) и на ходу преобразовываются?

Элементарный пример: знак вопроса в кружочке(конкретно эту можно найти с тенями, просто пример хорошо описывается). На 24bit края кружочка получаются рваные, на темно-синем фоне это заметно. На стандарном серо-белесо-желтоватом это прокатывало.
Т.е. даж не знаю как быть. Если картинка очень стандартная, то иконку найти можно, если не очень, то только битмап-24, и он выглядет иногда таки не на уровне, как в примере со знаком вопроса.
Я закрашиваю фон в синий и делаю ImageList по принципу
Код: plaintext
1.
2.
    m_hImlTB = ImageList_Create( 16 ,  16 , ILC_MASK Or ILC_COLOR32,  1 ,  0 )
    ImageList_AddMasked m_hImlTB, LoadResPicture( 101 , vbResBitmap), vbBlue
    ImageList_AddMasked m_hImlTB, LoadResPicture( 102 , vbResBitmap), vbBlue
...
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36668170
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Дмитрий771) Кулбар вообще обязателен? Лишний контрол+таки лишняя OCX...Без него не получается, может ребар через API.
Ну это как раз оказалось относит. несложно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private Const REBARCLASSNAME = "ReBarWindow32"
Private Const RBS_BANDBORDERS = &H400
Private Const RBBS_VARIABLEHEIGHT = &H40

Sub CreateTheReBar()

 Dim RebarStyle As Long
' WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
'        WS_CLIPCHILDREN | RBS_VARHEIGHT |
'        CCS_NODIVIDER | RBS_BANDBORDERS,

 RebarStyle = WS_CHILD Or WS_VISIBLE Or WS_CLIPSIBLINGS Or _
                WS_CLIPCHILDREN Or RBS_VARHEIGHT Or _
                CCS_NODIVIDER Or RBS_BANDBORDERS

    g_hwndRebar = CreateWindowEx(WS_EX_TOOLWINDOW, _
      REBARCLASSNAME, _
      vbNullString, _
      RebarStyle, _
       0 , _
       0 , _
       0 , _
       0 , _
      Form1.hWnd, _
       0 &, _
      App.hInstance, _
       0 &)
'    // Create the rebar.
'    HWND hwndRebar = CreateWindowEx(WS_EX_TOOLWINDOW,
'        REBARCLASSNAME,
'        NULL,
'        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
'        WS_CLIPCHILDREN | RBS_VARHEIGHT |
'        CCS_NODIVIDER | RBS_BANDBORDERS,
'        0,0,0,0,
'        hwndOwner,
'        NULL,
'        g_hInst, // global instance handle
'        NULL);
End Sub
Но все остальные заданные вопросы с иконками/размерами кнопок сохранились
К ним добавился вопрос про vbAlignTop применительно к API-rebar.(приведенный код это не обеспечивает)
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36669842
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Цветность иконок в Тулбар.
Не могу понять как приложения их "рисуют красиво".
Не далее как вчера копал эту тему, пришел к выводу, что 24-х битных битмап для Тулбара достаточно, для Listview-Treeview я сейчас использую 32-бит иконки с прозрачными тенями...
(дублирую и заменяю bat-файлом в готовом exe)

Проблема в чем. Честно тырятся ресурсы из стандартных прог.
Причем Win прога берет их очевидно из bimap.
Это очевидно потому что я не сумел найти иконки с альфа-каналом картинок требуемого вида, как не искал.
Может какая-то хитрая обработка через gdi делается? в смысле тени/прозрачность как-то кодируются в битмапах(каким то цветом, не маск color а что-то другое) и на ходу преобразовываются?

Элементарный пример: знак вопроса в кружочке(конкретно эту можно найти с тенями, просто пример хорошо описывается). На 24bit края кружочка получаются рваные, на темно-синем фоне это заметно. На стандарном серо-белесо-желтоватом это прокатывало.
Т.е. даж не знаю как быть. Если картинка очень стандартная, то иконку найти можно, если не очень, то только битмап-24, и он выглядет иногда таки не на уровне, как в примере со знаком вопроса....
Похоже придется искать/дорисовывать прозрачность 32bit, иначе все плохо. Проблема только в долгом времени рисовки/отработки каждой картинки.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36672152
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) Кулбар вообще обязателен?По крайней мере для отображения gripper ("полоска или точки в заголовках панелей") - да. Впрочем, это, наверное, меньшая из причин.Дмитрий77Лишний контрол+таки лишняя OCX...Рано думать об оптимизации.Дмитрий772) Мне не удалось убрать "пустую" панель, если ее вычеркнуть в конструкторе, то вообще ничего не отображается.
А из кода через Remove почему-то с ходу не вышло.Вроде, решено?Дмитрий773) С VB тулбаром все эти фокусы сделать нельзя?У него несистемный (=недокументированный на уровне системных, и неразвиваемый) класс окна.Дмитрий77а ControlSpyV6 и spy++ это не тоже самое?Нет. Spy++ - утилита из MS Visual Studio, у Borland такая называлась WinSight32, есть ещё аналоги. Позволяет увидеть иерархический список окон, их стили, сообщения и т. п. Must have программа для "подглядывания" за строением окон.Дмитрий771) Я должен при помощи этих прог подобрать стиль того чего я хочу методом тыка?Отчасти, относительно Theme Explorer. Надо понять, является ли такая заливка тематической (системной на уровне залогиненного пользователя), и, если да, каковы параметры, которые надо передавать тематическим API. Либо это рюшечки и бантики в конкретном оконном классе, не имеющие настроек на уровне системы.Дмитрий772) Или они мне разложат по косточкам имеющуюся прогу типа Windows Mail и опишут из чего там сделан этот Тулбар?Да, Spy++.Дмитрий77Первое кажется более реальным, но с ControlSpyV6 только удалось узреть прозрачный тулбар с черной подложкой.Ну, под него ж битмап не подкладывают.Дмитрий77Если второе, то Шариков не догоняет как это делается.Коль Полиграф Полиграфыч сам догнал про АБЫРВАЛГ, догонит и про обращение со Spy++ :)
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36672197
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По высоте-ширине кнопок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Private Type TLongX1
   l0 As Long
End Type
Private Type TIntX2
   i0 As Integer
   i1 As Integer
End Type
Public Function MAKELONG(ByVal a As Integer, ByVal b As Integer) As Long
 Dim ix2 As TIntX2
 Dim lx1 As TLongX1
 ix2.i0 = a
 ix2.i1 = b
 LSet lx1 = ix2
 MAKELONG = lx1.l0
End Function
...
Public Function CreateTheToolBar(ByVal hwndParent As Long) As Long
...
 g_hwndToolBar = CreateWindowEx( 0 , TOOLBARCLASSNAME, vbNullString, _
                                ToolbarStyle,  0 ,  0 ,  0 ,  0 , hwndParent,  0 , _
                                App.hInstance, ByVal  0 &)
 SendMessage g_hwndToolBar, TB_SETIMAGELIST, ID_IMAGELIST, _
             ByVal Form1.ImageList1.hImageList
...
 SendMessage g_hwndToolBar, TB_BUTTONSTRUCTSIZE, LenB(tbButtonsCreate( 0 )), _
             ByVal  0 &
 SendMessage g_hwndToolBar, TB_SETBUTTONSIZE,  0 , ByVal MAKELONG( 50 ,  32 )
 SendMessage g_hwndToolBar, TB_ADDBUTTONS, _
             UBound(tbButtonsCreate) - LBound(tbButtonsCreate) +  1 , _
             tbButtonsCreate( 0 )
 SendMessage g_hwndToolBar, TB_AUTOSIZE,  0 , ByVal  0 &
...
End Function
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36673050
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

по иконкам. Судя по официальному описанию , процесс создания иконок многоступенчатый, и включает использование таких программных пакетов как Macromedia FreeHand или Adobe Illustrator, Adobe Photoshop, GIF Movie Gear. В процессе происходит перевод с включённым антиалиайзингом (что подразумевает создание карты прозрачности) векторного оригинального изображения в растровое (возможно, есть альтернатива - уменьшение большого растрового оригинала), и применение эффекта наложения тени. В общем, попытка автоматизации этого процесса требует экспериментов.

Проверил - в ресурсах XP-шного Explorer.exe десяток 32-битных иконок с альфа-каналом, в iexplore.exe тоже есть несколько.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36673186
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

по иконкам ладно, я все уже переделал на 32bit-icon
С размерами кнопок ничего не получается.
БенедиктПо высоте-ширине кнопок:
Ни Ваш код, ни то что пытался делать я до этого (по сути тоже самое) не увеличивает высоту тулбара по вертикали.
Т.е. размер кнопок увеличивается, но сам Тулбар по вертикали не увеличивается, т.е. кнопки срезаются, причем срезает именно сам Тулбар, ибо если увеличить высоту CoolBar добавлением соседней панели с высоким скажем TextBox, то все равно срезает.
Я уж пытался ImageList использовать с картинками 24х24 напр.(маленькую 16х16 вставляешь в центр большой картинки), и опять высота тулбар маленькая.

Т.е. идея какая: кнопку сделать чуть больше, скажем 24х24 (или 20х20), может чуть вытянуть по ширине(это получается хоть и с нелинейностью какой-то), а посередине картинка 16х16, чтоб налеплено не было, да и градиентная полоса пошире была, опять же экспериментировать надо как красивше. Но суть в том что сам эксперимент не удается поставить из-за срезания кнопок в Toolbar снизу. И кстати если использовать 16х16, то надо еще чтоб это 16 по центру кнопки было, а не в левом верхнем углу.

БенедиктДмитрий77Лишний контрол+таки лишняя OCX...Рано думать об оптимизации.
Так вроде ж нарисовал уже ребар через API. Только как ему "vbTop" авто-обеспечить?
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36673424
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

кнопки 50*32.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36673708
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

понятно я копал под Тулбар, а надо было копать таки под ребар.
Код: plaintext
1.
2.
3.
 Dim rbBand As REBARBANDINFO
 With rbBand
...
    .cyMinChild =  33  ' 22 

Думаю оптимально вот так (это при 16х16)
SendMessage g_hwndToolBar, TB_SETBUTTONSIZE, 0, ByVal MAKELONG(32, 32)
И убрать таки Or RBBS_CHILDEDGE
А Or RBBS_GRIPPERALWAYS напротив мысль очень понравилась, давно хотел это сделать с vb-тулбар/coolbar, потом забил.
Код: plaintext
1.
    .fStyle = RBBS_NOVERT Or RBBS_GRIPPERALWAYS 'Or RBBS_CHILDEDGE
По вертикали картинка теперь "автоматом" ложится по центру(но почему-то не в вашем примере а в моей реализации сделанной из вашей предыдущей), такое ощущение что это делает манифест, в IDE она вверху. Но по горизонтали она слева-таки.
Как бы положение картинки по центру кнопки в лоб задать?
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36673787
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,
Дмитрий77По вертикали картинка теперь "автоматом" ложится по центру(но почему-то не в вашем примере а в моей реализации сделанной из вашей предыдущей), такое ощущение что это делает манифест, в IDE она вверху. Но по горизонтали она слева-таки.
Как бы положение картинки по центру кнопки в лоб задать?
Получается ровно по центру если убрать Or TBSTYLE_LIST. Но в вашем крайнем примере что-то не то с центровкой по вертикали, а в "моем" почему-то "то" если exe запускать. Разница что у меня ImageList: иконки через makeintresource, а у Вас VB-Imagelist c битмапами.

Что-то еще в стиле Rebar не хватает типа рамочки что-ли.
И чтоб ребар (в API-шном варианте) перерисовывался OnTop при Form_Resize...
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36673926
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Что-то еще в стиле Rebar не хватает типа рамочки что-ли.
И чтоб ребар (в API-шном варианте) перерисовывался OnTop при Form_Resize...

Вообще требуемая "рамочка" (по всему судя относится к CoolBar/Rebar) возникает автоматически

1. Для VB-Coolbar:
автоматически для всех стилей Классика/XP/Vista

2.Для API-Rebar
автоматически для XP/Vista
Для классики почему-то нет.

Но вижу кажется проблему. Подложная картинка собой замазывает этот контур: снизу точно.
Или надо делать чтоб не замазывала, либо этот контур должен быть нижней частью самой градиентной картинки...
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36674486
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все таки "сим-сим откройся" .
Код: plaintext
     SetWindowTheme g_hwndRebar, StrPtr("Communications"),  0  'стиль для Висты

http://ukintel.deviantart.com/art/Vista-Visual-Style-Classes-87482323



Дмитрий77Получается ровно по центру если убрать Or TBSTYLE_LIST. Но в вашем крайнем примере что-то не то с центровкой по вертикали, а в "моем" почему-то "то" если exe запускать. Разница что у меня ImageList: иконки через makeintresource, а у Вас VB-Imagelist c битмапами....
По вертикали картинка центрируется манифестом.

Дмитрий77И чтоб ребар (в API-шном варианте) перерисовывался OnTop при Form_Resize...
Код: plaintext
1.
2.
Private Sub Form_Resize()
SendMessage g_hwndRebar, WM_SIZE,  0 ,  0 
End Sub
Дмитрий77Что-то еще в стиле Rebar не хватает типа рамочки что-ли...Для API-Rebar
Для классики почему-то нет...
Вопрос остался. Нижняя картинка это иллюстрирует.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36675306
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

ну вот, значит есть тематические заливки.

По границе и размерам для "классики" в приложении.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36675836
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктПо границе и размерам для "классики" в приложении.
Да, спасибо, суть понял.
Код: plaintext
RebarStyle = ...Or RBS_FIXEDORDER ...Or CCS_NOPARENTALIGN ...

====================================================
Вообще конечно без Вашего тест-примера, правильным образом поставленного я бы это не осилил, наверное, хотя и получается что Ваша реализация заливки через GDI+- теперь как бы не при делах.
Просто Google это хорошо, но надо еще чувствовать-знать чего ищешь и под каким углом. До Spy+- итд руки не дошли...

В принципе, поставленная задача решена 100%. "Communications" это и есть то чего хотелось.
Тем не менее, пока не "притупилось", я бы чуть глубже копнул.

1. Среди всех стилей кот. я засунул в Combobox нет основного, мутно-зеленого градиента, кот. Виста использует в проводнике. На картинке 3-е окно сверху слева. Понятно, что рисовать через API я уже не прошу/не предлагаю, с учетом уже осознанного это неправильно.


Ну по существу, не все там у меня в комбобоксе "засунуто" корректно, но
Communications
Media
Help
Default + его производные
это уже сильно больше чем ничего.

2. Как следует из описания классов
http://ukintel.deviantart.com/art/Vista-Visual-Style-Classes-87482323
стили якобы можно применять не обязательно к Rebar, но также и к самому Toolbar.
Код: plaintext
1.
 073 : Media::Toolbar
 074 : Communications::Toolbar
Естественно начал пытаться с Вашим же примером (т.е. с API-Toolbar) типа в лоб.
Код: plaintext
 CreateTheToolBar form1.hwnd
Там рисуется какое-то убожество с просвечиванием окна что под формой, у меня такое убожество и раньше получалось, когда экспериментировал с "прозрачностью" тулбара.
Сомневаюсь что к убожеству можно пытаться применять стили. Т.е. нужно мне нарисовать просто API Тулбар на форме (без Rebar) и с ним поэкспериментировать со стилями, как нарисовать не знаю.

3.Есть предположение, что все же м.б. можно применить стили и к VB-Toolbar тоже. Было бы неплохо. Следуя наблюдениям, могу предположить, что надо сабклассить VB-Toolbar и глушить какие-нибудь сообщения, по аналогии как это делается при применении API-ImageList к VB-TreeView. Есть ли соображения какие именно Msg надо убивать? Или все-таки настаиваете что
БенедиктДмитрий773) С VB тулбаром все эти фокусы сделать нельзя?У него несистемный (=недокументированный на уровне системных, и неразвиваемый) класс окна.
C ListView/TreeView же с этим проблем как выяснилось вообще никаких...

В принципе, конечно, думаю и API-Toolbar+API-Rebar сгодится, и это правильно, и у меня почти все готово чтобы его воткнуть в рабочее приложение, по крайней мере чтоб он там "красиво сидел/перерисовывался". Естественно придется дорабатывать/изучать все процедуры/коды с ним связанные и т.п. но это уже детали, думаю осилится.
Но все же хорошо такую возможнось с VB-Toolbar иметь, если оно в принципе достижимо .
Например что касается API-Rebar/VB-Coolbar то разницы вообще никакой, т.е. стили к CoolBar применяются также хорошо. Здесь я конечно склоняюсь в пользу API-Rebar, ибо создать его не тяжело и не надо тащить (+ регистрировать) лишнюю библиотеку, а Control-5 и так тащатся за прогой, видимо это судьба.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36676210
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77БенедиктПо границе и размерам для "классики" в приложении.
Да, спасибо, суть понял.
Код: plaintext
RebarStyle = ...Or RBS_FIXEDORDER ...Or CCS_NOPARENTALIGN ...

Бенедикт,
Sorry, не доглядел. Там этим далеко не ограничивается, в смысле не так все просто.

Код: plaintext
1.
2.
GetClientRect Form1.hWnd, rcClient 'при создании Rebar
'...а дальше нетривиальная процедура
Private Sub Form_Resize()
Шариков на такое не способен...
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #36681365
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень нравится, что на XP стиле получается...

Т.е. эдакий выпуклый ребар, как бы задвигающий собой меню, кот. к ребар отношения не имеет.
Красиво (и стандартно для классики и для XP-стиля ), когда классическая горизонтальная полоса между меню и тулбар/ребар.
Т.е. хочется как на нижней картинке (снизу и по краям тулбара полосы нет).
Для vb-тулбара эта полоса рисуется автоматически.

Для конструкции Toolbar в Rebar можно конечно не применять Or CCS_NODIVIDER для ToolbarStyle, т.е. для самого Toolbar, но в этом случае полоса будет обрезана по краям, т.к. относится к Toolbar а не к ребар, а на XP-стиле еще и наложится на выпуклость.

Допускаю что это нерешаемо. Дело в том что если меню тоже находится внутри ребар, то эта полоса будет называться RBS_BANDBORDERS, т.е. делитель бандов.
Но в моем случае используется обычное vb-меню.

Т.е. если сформулировать:
1) Как убрать выпуклость (на xp-стиле)
2) Как сделать горизонт. полосу только сверху.(на классике и на XP).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #38221206
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий772. Как следует из описания классов
http://ukintel.deviantart.com/art/Vista-Visual-Style-Classes-87482323
стили якобы можно применять не обязательно к Rebar, но также и к самому Toolbar.
Код: vbnet
1.
2.
073: Media::Toolbar
074: Communications::Toolbar


Естественно начал пытаться с Вашим же примером (т.е. с API-Toolbar) типа в лоб.
Кстати выяснил в чем фишка.
Градиентная подложка определяется ребаром.
А вот если на кнопках есть еще и надписи:


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  With tbButtonsCreate(0) 'CONTACT_NEW (0)
    .iBitmap = 0
    .idCommand = 1
    .iString = VarPtr(StringToMas("New Contact").ByteStr(0))
    .fsState = TBSTATE_ENABLED
    .fsStyle = BTNS_BUTTON Or BTNS_AUTOSIZE
  End With
  ToolbarStyle = WS_CHILD Or WS_VISIBLE Or _
                TBSTYLE_TOOLTIPS Or WS_CLIPCHILDREN Or _
                WS_CLIPSIBLINGS Or CCS_NODIVIDER Or CCS_NORESIZE Or _
                TBSTYLE_FLAT Or CCS_TOP Or TBSTYLE_LIST
                
  g_hwndToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, vbNullString, _
                                ToolbarStyle, 0, 0, 0, 0, hwndParent, 0, _
                                App.hInstance, ByVal 0&)


, то они по умолчанию будут черными и обычными (это на тематическом темно-синем градиентном фоне)

Поэтому стиль надо применять еще и к самому Тулбар:

Код: vbnet
1.
2.
3.
  If IsWinVista And ThemesEnabled(g_hwndToolBar) Then
    SetWindowTheme g_hwndToolBar, StrPtr("Communications"), 0 'стиль для Висты
  End If


Тогда надписи станут "стильными", в данном примере белыми.
Просто до сих пор одни картинки в кнопках использовал.

Намучился кстати с этими надписями.
Еле утряс эти стили, TBSTYLE_LIST, BTNS_AUTOSIZE и TB_SETMETRICS в правильной последовательности. Меняешь стиль, высота прыгает и т.п.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #38221300
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Намучился кстати с этими надписями.
Еле утряс эти стили, TBSTYLE_LIST, BTNS_AUTOSIZE и TB_SETMETRICS в правильной последовательности. Меняешь стиль, высота прыгает и т.п.Да-да, тулбар на редкость придирчив при стилизации кнопок, тоже долго мучился пока не отловил нужную комбинацию.
...
Рейтинг: 0 / 0
Градиенты в Vista стиле, и в частности подложка под Toolbar.
    #38227193
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771. Среди всех стилей ...нет основного, мутно-зеленого градиента, кот. Виста использует в проводнике.
Ну нету его здесь:
http://ukintel.deviantart.com/art/Vista-Visual-Style-Classes-87482323

Не может такого быть чтоб не было.

Допустим я могу вытащить
hTheme = GetWindowTheme(g_hwndRebar)

Но сразу 3 вопроса:
1) Как мне натравить эту ф-цию на окно проводника (в Висте) - как узнать g_hwndRebar этого ребара.
2) Допустим узнал. Что мне делать дальше с HTHEME
Скорее всего что-то связанное с:
этими ф-циями
3) и допустим если я нашел ЭТО, то как применить к своему rebar

Угадать-то надо всего одно слово.
М.б. оно не в aero.msstyle, а в каком другом месте.

Spy++ даже никаких намеков не дает, ну м.б. поможет найти g_hwndRebar.

Бесит меня этот вопрос.
Есть идеи (кроме рисования подложек)?
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Градиенты в Vista стиле, и в частности подложка под Toolbar.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]