powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Градиенты в Vista стиле, и в частности подложка под Toolbar.
25 сообщений из 39, страница 1 из 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
25 сообщений из 39, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Градиенты в Vista стиле, и в частности подложка под Toolbar.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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