powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рисунок для набора вкладок
46 сообщений из 46, показаны все 2 страниц
Рисунок для набора вкладок
    #34944526
Добрый день!

Для набора вкладок есть возможность назначать пиктограммы для каждой вкладки.
С рисунками из внешних файлов более-менее понятно, а вот как программно назначить рисунок из предлагаемого Мастером набора?

Спасибо.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34946351
Нема идей?
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34947595
Дааааа...
Вопрос оказался неожиданно сложным...
:)
Или неактуальным...
:(
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34949431
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присваивая свойство Page.PictureData. Подробнее.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34952334
Эту тему я видел, но там источник рисунка другой...
Мне интересны встроенные рисунки Офиса.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34952815
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег Мамченко,
что такое "встроенные рисунки Офиса"? Можно понять так, что это картинки, имеющие FaceId. Но и этот случай (источник - объект типа StdPicture/IPictureDisp/IPicture (Office.CommandBarButton.Picture, скажем)), и случай, когда дамп значения свойства PictureData берётся откуда-то (например, из BLOB-поля таблицы), рассмотрены в той теме.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34956790
Ну вот, например, создаю пункт контекстного меню, этот пункт будет обозначен картинкой с FaceId = 358 из встроенного набора

Код: plaintext
1.
2.
3.
4.
Set cbrRecordDelete = cbr.Controls.Add(msoControlButton, , , , True)
cbrRecordDelete.BeginGroup = True
cbrRecordDelete.FaceId =  358 
cbrRecordDelete.Caption = "Delete record"
cbrRecordDelete.OnAction = "=on_DeleteRecord(True)"

А вот как присвоить этот, или другой рисунок, вкладке?
Вот диалог выбора рисунка для вкладки, как правильно назвать этот набор предлагаемых рисунков и как программно назначить рисунок этого восклицательного знака вкладке?
Мне кажется проблема должна иметь более простое решение, чем в указанной ссылке, имхо, конечно...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34956819
Фотография Старый ворчун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это форма pb_FrmPictureBuilder из ACWZMAIN.MDE
Многие рисунки отображаемые на этой форме хранятся в поле PictureData таблицы bw_TblPictures файла ACWZDAT.MDT .
Ничто не мешает вам их использовать.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34959888
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег МамченкоНу вот, например, создаю пункт контекстного меню, этот пункт будет обозначен картинкой с FaceId = 358 из встроенного набора ... А вот как присвоить этот, или другой рисунок, вкладке?Что касается рисунка с FaceId:
1) без временного файла, но с модулем
Код: plaintext
LoadPictureDataFromIPictureDIB cbrRecordDelete.Picture, Вкладка2
2) без модуля, но с временным файлом
Код: plaintext
1.
2.
SavePicture cbrRecordDelete.Picture, "Bill.bmp"
Вкладка2.Picture = "Bill.bmp"
Kill "Bill.bmp"
Что касается чтения напрямую значения свойства PictureData из поля таблицы, то Вам уже дважды указали на таблицу bw_TblPictures файла ACWZDAT.MDT (его название я тогда не вспомнил, назвал "каким-то .mda"). Таблицу и код аналогичного свойства см. в .mdb из той же темы.

Кажется, что можно проще - предлагайте своё решение. Ctrl+C,
Ctrl+V - это просто. Имхо, конечно... ;)
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34962640
С выбором картинки из таблицы разобрался, спасибо...
Но...
авторВам уже дважды указали на таблицу bw_TblPictures файла ACWZDAT.MDT
В этой таблице далеко не все картинки, которые предлагает форма с предыдущего скриншота...
Всего 41...
По крайней мере у меня так, после импорта указанной таблицы в мою базу.
А уж если взять те картинки, которые можно присвоить используя этот метод
Код: plaintext
1.
2.
3.
4.
Set cbrRecordDelete = cbr.Controls.Add(msoControlButton, , , , True)
cbrRecordDelete.BeginGroup = True
cbrRecordDelete.FaceId =  358 
cbrRecordDelete.Caption = "Delete record"
cbrRecordDelete.OnAction = "=on_DeleteRecord(True)"

то там их ооочень много...
и собраны они со всех приложений Офиса, вот скриншот сгенерированной панели, и это одна треть...
С этим не поможете разобраться?
Откуда вытащить этот набор?
Спасибо
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34962641
Скриншот для предыдущего поста...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34963944
А у вкладки нет свойства FaceId?
Чтоб использовать CopyFace и PasteFace с какойнибудь невидимой кнопки на тулбаре...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34963993
Спасибо за исправление темы!
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34964041
Фотография Старый ворчун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег МамченкоА у вкладки нет свойства FaceId?
Чтоб использовать CopyFace и PasteFace с какойнибудь невидимой кнопки на тулбаре...

Вы можете сделать CopyFace, а потом преобразовать в IPictureDisp (видел пример на http://am.rusimport.ru).

Далее можно сделать через файл или использовать пример Бенедикта.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34964518
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Олег МамченкоСпасибо за исправление темы!
Всегда пожалуйста. В следующий раз обращайтесь к модераторам через "Сообщить модератору", а не ждите, пока мы случайно наткнемся сами.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34964580
im_vooov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, наткнулся, пример на am.rusimport.ru
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34970347
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег Мамченко,

создайте невидимую временную панель инструментов,
создайте временную кнопку на ней,
присвойте её свойству FaceId нужное значение,
вызовите LoadPictureDataFromIPictureDIB кнопка.Picture, вкладка,
убейте кнопку,
убейте панель.

В переводе на VBA:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Кнопка0_Click()
 Dim cbr As Office.CommandBar
 Dim cbn As Office.CommandBarButton
 
 Set cbr = CommandBars.Add("Custom2", msoBarTop, , True)
 Set cbn = cbr.Controls.Add(msoControlButton, , , , True)
 cbn.FaceId =  358 
 
 LoadPictureDataFromIPictureDIB cbn.Picture, НаборВкладок1.Pages("Вкладка2")
 
 cbn.Delete
 Set cbn = Nothing
 cbr.Delete
 Set cbr = Nothing
End Sub
Модифицированный вариант функции LoadPictureDataFromIPictureDIB() в отдельном модуле:
Код: 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.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
Option Compare Database
Option Explicit

Private Type BITMAP '24 bytes
   bmType As Long
   bmWidth As Long
   bmHeight As Long
   bmWidthBytes As Long
   bmPlanes As Integer
   bmBitsPixel As Integer
   bmBits As Long
End Type

Private Type BITMAPINFOHEADER '40 bytes
   biSize As Long
   biWidth As Long
   biHeight As Long
   biPlanes As Integer
   biBitCount As Integer
   biCompression As Long
   biSizeImage As Long
   biXPelsPerMeter As Long
   biYPelsPerMeter As Long
   biClrUsed As Long
   biClrImportant As Long
End Type

Private Type RGBQUAD
   rgbBlue As Byte
   rgbGreen As Byte
   rgbRed As Byte
   rgbReserved As Byte
End Type
Private Const SIZEOF_RGBQUAD =  4 

Private Type BITMAPINFO
   bmiHeader As BITMAPINFOHEADER
   bmiColors As RGBQUAD
End Type

Private Type DIBSECTION
   dsBm As BITMAP
   dsBmih As BITMAPINFOHEADER
   dsBitfields( 0  To  2 ) As Long
   dshSection As Long
   dsOffset As Long
End Type


Private Declare Function GetObjectA Lib "gdi32" ( _
   ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function SelectObject Lib "gdi32" ( _
   ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" ( _
   ByVal hObject As Long) As Long
Private Declare Function GetObjectType Lib "gdi32" ( _
   ByVal hgdiobj As Long) As Long
Private Const OBJ_BITMAP =  7 

Private Declare Function GetActiveWindow Lib "user32" () As Long

Private Declare Function GetDC Lib "user32" ( _
   ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" ( _
   ByVal hWnd As Long, ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
   ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" ( _
   ByVal hDC As Long) As Long

Private Declare Function CreateDIBSection Lib "gdi32" ( _
   ByVal hDC As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, _
   lpVoid As Any, ByVal Handle As Long, ByVal dw As Long) As Long
Private Const DIB_RGB_COLORS =  0  '  color table in RGBs
Private Declare Function GetDIBColorTableAny Lib "gdi32" _
   Alias "GetDIBColorTable" ( _
   ByVal hDC As Long, ByVal un1 As Long, _
   ByVal un2 As Long, pRGBQuad As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
   Destination As Any, Source As Any, ByVal Length As Long)


Public Function LoadPictureDataFromIPictureDIB( _
   SrcPic As stdole.IPicture, ByVal DstObj As Object, _
   Optional ByVal hwndRef As Long =  0 , _
   Optional ByVal ReleasePicRef As Boolean = False) As Boolean
 Dim ds As DIBSECTION
 Dim cbSize As Long
 Dim cbCopied As Long
 Dim hdcRef As Long
 Dim bmi As BITMAPINFO
 Dim hdcMem As Long
 Dim hbmMem As Long
 Dim hbmOld As Long
 Dim bPicData() As Byte
 
 'Ожидается pic.Type=vbPicTypeBitmap=1,GetObjectType(pic.Handle)=OBJ_BITMAP=7
 If GetObjectType(SrcPic.Handle) <> OBJ_BITMAP Then Exit Function

 'Получаем заголовок DIB-секции. Однако, в нём может быть заполнена только
 'структура BITMAP.
 cbSize = LenB(ds)
 ds.dsBmih.biSize = LenB(ds.dsBmih)
 cbCopied = GetObjectA(SrcPic.Handle, cbSize, ds)
 
 If cbCopied = cbSize Then 'DIB-секция полностью заполнена
    If (ds.dsBmih.biClrUsed =  0 ) And (ds.dsBmih.biBitCount <  16 ) Then _
       ds.dsBmih.biClrUsed =  2 & ^ ds.dsBmih.biBitCount
    
    ReDim bPicData( 0  To _
                   ds.dsBmih.biSize + ds.dsBmih.biSizeImage + _
                   ds.dsBmih.biClrUsed * SIZEOF_RGBQUAD -  1 ) As Byte
    
    'Таблица цветов (если есть)
    If ds.dsBmih.biClrUsed And (ds.dsBmih.biBitCount <  16 ) Then
       If hwndRef =  0  Then hwndRef = GetActiveWindow()
       hdcRef = GetDC(hwndRef)
       If hdcRef =  0  Then Exit Function
    
       hdcMem = CreateCompatibleDC(hdcRef)
       hdcRef = ReleaseDC(hwndRef, hdcRef): hdcRef =  0 
       If hdcMem =  0  Then Exit Function
       
       hbmOld = SelectObject(hdcMem, SrcPic.Handle)
       If hbmOld =  0  Then hdcMem = DeleteDC(hdcMem): hdcMem =  0 : Exit Function
       
       cbCopied = GetDIBColorTableAny(hdcMem,  0 , ds.dsBmih.biClrUsed, _
                                      bPicData(ds.dsBmih.biSize))
       If cbCopied <> ds.dsBmih.biClrUsed Then
          Debug.Print "Wrong number of color table entries copied!"
          ReDim Preserve bPicData( 0  To _
                         ds.dsBmih.biSize + ds.dsBmih.biSizeImage + _
                         cbCopied * SIZEOF_RGBQUAD -  1 ) As Byte
       End If
       
       hbmOld = SelectObject(hdcMem, hbmOld): hbmOld =  0 
       hdcMem = DeleteDC(hdcMem): hdcMem =  0 
    End If
 
 ElseIf cbCopied = LenB(ds.dsBm) Then
    'Может оказаться, что картника в терминах GDI является BITMAP-ом,
    'а не DIBSECTION. Приводим её к DIBSECTION.
    If hwndRef =  0  Then hwndRef = GetActiveWindow()
    hdcRef = GetDC(hwndRef)
    If hdcRef =  0  Then Exit Function
 
    hdcMem = CreateCompatibleDC(hdcRef)
    hdcRef = ReleaseDC(hwndRef, hdcRef): hdcRef =  0 
    If hdcMem =  0  Then Exit Function
    
    With bmi.bmiHeader
       .biSize = LenB(bmi.bmiHeader)
       .biPlanes =  1 
       .biBitCount =  32 
       .biWidth = ds.dsBm.bmWidth
       .biHeight = ds.dsBm.bmHeight
    End With
    hbmMem = CreateDIBSection( 0 , bmi, DIB_RGB_COLORS, ByVal  0 &,  0 ,  0 )
    hbmOld = SelectObject(hdcMem, hbmMem)
    If hbmOld =  0  Then
       If hbmMem Then hbmMem = DeleteObject(hbmMem): hbmMem =  0 
       hdcMem = DeleteDC(hdcMem): hdcMem =  0 
       Exit Function
    End If
    
    'Поленился делать отрисовку средствами GDI, но сократил код
    SrcPic.Render hdcMem,  0 , ds.dsBm.bmHeight, ds.dsBm.bmWidth, _
                  -ds.dsBm.bmHeight,  0 ,  0 , SrcPic.Width, SrcPic.Height, ByVal  0 &
    
    hbmOld = SelectObject(hdcMem, hbmOld): hbmOld =  0 
    hdcMem = DeleteDC(hdcMem): hdcMem =  0 
 
    cbSize = LenB(ds)
    cbCopied = GetObjectA(hbmMem, cbSize, ds)
 
    ReDim bPicData( 0  To ds.dsBmih.biSize + ds.dsBmih.biSizeImage -  1 ) As Byte
 Else
    Exit Function
 End If
 
 'Заголовок
 CopyMemory bPicData( 0 ), ds.dsBmih, ds.dsBmih.biSize
 
 'Тело
 CopyMemory bPicData(ds.dsBmih.biSize + _
                     ds.dsBmih.biClrUsed * SIZEOF_RGBQUAD), _
            ByVal ds.dsBm.bmBits, ds.dsBmih.biSizeImage
 If hbmMem Then hbmMem = DeleteObject(hbmMem): hbmMem =  0 
 
 DstObj.PictureData = bPicData
 
 'Освобождаем память
 Erase bPicData
 If ReleasePicRef Then Set SrcPic = Nothing
 
 LoadPictureDataFromIPictureDIB = True
End Function
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34972609
Как раз пришёл к необходимости создавать кнопку на баре...
:)
Сидел разбирался с практической реализацией копирования рисунка с неё, а тут и помощь подоспела...
В результате получается на чёрном фоне...
Что бы это значило?..
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34974866
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег МамченкоВ результате получается на чёрном фоне...
Что бы это значило?..Вопрос для "Что? Где? Когда?" :)
У меня Access XP, а в 2003-м и 2007-м есть отличия. Чтобы учесть прозрачность, надо скомбинировать картинку из cbn.Picture с картинкой из cbn.Mask, и заменить прозрачные участки серым RGB(192, 192, 192) цветом. Поэтому ответьте (если не справитесь сами):
1) В каких версиях Access предполагается работа базы?
2) В каких ОС?
3) Приложите картинки cbn.Picture и cbn.Mask (SavePicture cbn.Picture, "C:\\pic.bmp": SavePicture cbn.Mask, "C:\\msk.bmp").
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34975629
автор1) В каких версиях Access предполагается работа базы?
2) В каких ОС?
3) Приложите картинки cbn.Picture и cbn.Mask (SavePicture cbn.Picture, "C:\pic.bmp": SavePicture cbn.Mask, "C:\msk.bmp").

1. Access 2003
2. Win XP
3. ниже...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34976772
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег Мамченко,
лень, как известно, двигатель прогресса. Поэтому, чтобы не переделывать модуль с LoadPictureDataFromIPictureDIB(), сделал ещё один:
Код: 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.
Option Explicit

Private Type BITMAP '24 bytes
   bmType As Long
   bmWidth As Long
   bmHeight As Long
   bmWidthBytes As Long
   bmPlanes As Integer
   bmBitsPixel As Integer
   bmBits As Long
End Type

Private Declare Function CreateIC Lib "gdi32" Alias "CreateICA" ( _
   ByVal lpDriverName As String, ByVal lpDeviceName As String, _
   ByVal lpOutput As String, lpInitData As Any) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
   ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" ( _
   ByVal hDC As Long) As Long

Private Declare Function GetObjectA Lib "gdi32" ( _
   ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function SelectObject Lib "gdi32" ( _
   ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" ( _
   ByVal hObject As Long) As Long
Private Declare Function GetObjectType Lib "gdi32" ( _
   ByVal hgdiobj As Long) As Long
Private Const OBJ_BITMAP =  7 

Private Declare Function CreateCompatibleBitmap Lib "gdi32" ( _
   ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function GetSysColor Lib "user32" ( _
   ByVal nIndex As Long) As Long
Private Const SYSCOLORMASK As Long = &H80000000

Private Declare Function CreateSolidBrush Lib "gdi32" ( _
   ByVal crColor As Long) As Long

Private Const SRCCOPY = &HCC0020         ' (DWORD) dest = source
Private Const ROP3_DSna = &H220326
Private Const ROP3_DPSao = &HEA02E9

Private Declare Function BitBlt Lib "gdi32" ( _
   ByVal hdcDst As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
   ByVal nHeight As Long, ByVal hdcSrc As Long, _
   ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long


Public Function CombinePicMask( _
   ByVal pdPic As IPictureDisp, ByVal pdMsk As IPictureDisp, _
   Optional ByVal BackColor As Long =  12632256 ) As IPictureDisp
 Dim hicRef As Long
 Dim hdcSrc As Long
 Dim hdcMsk As Long
 Dim hdcDst As Long
 Dim hbmSrc As Long
 Dim hbmMsk As Long
 Dim hbmDst As Long
 Dim hbmSrcOld As Long
 Dim hbmMskOld As Long
 Dim hbmDstOld As Long
 Dim cbSize As Long
 Dim cbCopied As Long
 Dim bmSrc As BITMAP
 Dim bmMsk As BITMAP
 Dim hbrDst As Long
 Dim hbrDstOld As Long
 
 'Проверка входных параметров
 If (pdPic Is Nothing) Or (pdMsk Is Nothing) Then Exit Function
 hbmSrc = pdPic.Handle
 If GetObjectType(hbmSrc) <> OBJ_BITMAP Then Exit Function
 hbmMsk = pdMsk.Handle
 If GetObjectType(hbmMsk) <> OBJ_BITMAP Then Exit Function
 cbSize = LenB(bmSrc)
 cbCopied = GetObjectA(hbmSrc, cbSize, bmSrc)
 If cbSize <> cbCopied Then Exit Function
 cbCopied = GetObjectA(hbmMsk, cbSize, bmMsk)
 If cbSize <> cbCopied Then Exit Function
 If (bmSrc.bmWidth <> bmMsk.bmWidth) Or _
    (bmSrc.bmHeight <> bmMsk.bmHeight) Then Exit Function
 
 'Создание контекстов устройств для манипуляций с растровыми изображениями
 hicRef = CreateIC("DISPLAY", vbNullString, vbNullString, ByVal  0 &)
 hdcSrc = CreateCompatibleDC(hicRef)
 hdcMsk = CreateCompatibleDC(hicRef)
 hdcDst = CreateCompatibleDC(hicRef)
 
 'Выбор и создание растровых изображений
 hbmSrcOld = SelectObject(hdcSrc, hbmSrc)
 hbmMskOld = SelectObject(hdcMsk, hbmMsk)
 hbmDst = CreateCompatibleBitmap(hicRef, bmSrc.bmWidth, bmSrc.bmHeight)
 hbmDstOld = SelectObject(hdcDst, hbmDst)
 
 'Создание и выбор фоновой кисти
 If BackColor And SYSCOLORMASK Then _
    BackColor = GetSysColor(BackColor Xor SYSCOLORMASK)
 hbrDst = CreateSolidBrush(BackColor)
 hbrDstOld = SelectObject(hdcDst, hbrDst)
 
 'Наложение изображений, подмена фона.
 'Незначительно отличается от классического ((D xor S) and M) xor S.
 'Не стал возиться с MaskBlt().
 BitBlt hdcDst,  0 ,  0 , bmSrc.bmWidth, bmSrc.bmHeight, hdcSrc,  0 ,  0 , SRCCOPY
 BitBlt hdcDst,  0 ,  0 , bmSrc.bmWidth, bmSrc.bmHeight, hdcMsk,  0 ,  0 , ROP3_DSna
 BitBlt hdcDst,  0 ,  0 , bmSrc.bmWidth, bmSrc.bmHeight, hdcMsk,  0 ,  0 , ROP3_DPSao
 
 'Выбор старых объектов и уничтожение созданных
 SelectObject hdcDst, hbrDstOld
 DeleteObject hbrDst
 
 SelectObject hdcDst, hbmDstOld
 SelectObject hdcMsk, hbmMskOld
 SelectObject hdcSrc, hbmSrcOld
 
 DeleteDC hdcDst
 DeleteDC hdcMsk
 DeleteDC hdcSrc
 DeleteDC hicRef
 
 'Возврат результата в объектном виде
 Set CombinePicMask = CreateIPictureDispFromHBITMAP(hbmDst)
End Function
, и добавил другой, старый:
Код: 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.
Option Explicit

Private Enum PICTYPE
   PICTYPE_UNINITIALIZED = - 1 
   PICTYPE_NONE =  0 
   PICTYPE_BITMAP =  1 
   PICTYPE_METAFILE =  2 
   PICTYPE_ICON =  3 
   PICTYPE_ENHMETAFILE =  4 
End Enum

Private Type GUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4( 0  To  7 ) As Byte
End Type

Private Type PicBmp
   Size As Long
   Type As PICTYPE
   hBmp As Long
   hPal As Long
   Reserved As Long
End Type

Private Declare Function OleCreatePictureIndirect Lib "olepro32" ( _
   PicDesc As PicBmp, RefIID As GUID, _
   ByVal fPictureOwnsHandle As Long, IPic As IPictureDisp) As Long

Public Function CreateIPictureDispFromHBITMAP( _
   ByVal hBitmap As Long, _
   Optional ByVal hPal As Long =  0 , _
   Optional ByVal fPictureOwnsHandle As Boolean = True) As IPictureDisp
 Dim IID_IDispatch As GUID
 Dim Pic As PicBmp

 With Pic
    .Size = Len(Pic)
    .Type = PICTYPE_BITMAP
    .hBmp = hBitmap
    .hPal = hPal
 End With
 With IID_IDispatch
    .Data1 = &H20400
    .Data4( 0 ) = &HC0
    .Data4( 7 ) = &H46
 End With
 OleCreatePictureIndirect Pic, IID_IDispatch, -fPictureOwnsHandle, _
                          CreateIPictureDispFromHBITMAP
End Function
Использование:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Кнопка0_Click()
 Dim cbr As Office.CommandBar
 Dim cbn As Office.CommandBarButton
 
 Set cbr = CommandBars.Add("Custom2", msoBarTop, , True)
 Set cbn = cbr.Controls.Add(msoControlButton, , , , True)
 cbn.FaceId =  358 
 
 LoadPictureDataFromIPictureDIB CombinePicMask(cbn.Picture, cbn.Mask), _
                                НаборВкладок1.Pages("Вкладка2")
 
 cbn.Delete
 Set cbn = Nothing
 cbr.Delete
 Set cbr = Nothing
End Sub
Пробуйте.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34978084
С фоном всё наладилось, но кажись какието проблемы с цветами...
Кажется уменьшилось их количество...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #34978317
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег Мамченко,
да, это такая "багофича" характерная именно для Page.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Рисунок для набора вкладок
    #37308056
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал функцию CombinePicMask - работает отлично.
Хочу её применить для загрузки в Риббон своих картинок, так вот незнаю какой цвет задать в третьем аргументе для прозрачности. Т.е. у меня есть 2 объекта IPictureDisp - picture и mask, соответственно, и риббон, цвет которого пользователь может изменить + он "градиентный". Короче, иконка выходит с цветом фона, заданным в третьем аргументе.

С другой стороны, так красиво смотрятся встроенные иконки!
Как-то попытался их извлечь с помощью Commandbars.GetImageMso ,
и записать в файл, а потом загрузить обратно в Риббон, уже из файла. Та же фигня...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37308733
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,

у нас тоже всё хорошо.

Если хотите задать вопросы, задайте вопросы.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37308745
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
БенедиктЕсли хотите задать вопросы, задайте вопросы.Ruskкакой цвет задать в третьем аргументе для прозрачности
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37308776
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БенедиктRusk,

у нас тоже всё хорошо.

Если хотите задать вопросы, задайте вопросы.

Очень рад за Вас.

А сейчас вопрос (с)
Какой цвет задать в третьем аргументе BackColor, вашей функции CombinePicMask, для прозрачного фона?

Спасибо.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309210
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,

У меня нет Офиса 2007, поэтому ответ теоретический: скорее всего, никакой, так как прозрачность ожидается обеспеченная не chromakey-ем (специально выбранным цветом), а картой (полу)прозрачности - 1-битной (прозрачно/непрозрачно) для изображений с цветностью до 8 бит включительно, 8-битной (256 градаций прозрачности) для 24-битных изображений.

Нравится ответ?

Если не нравится, давайте поэкспериментируем, и попробуем подсунуть в Ribbon 32-битную иконку с альфа-каналом (карта полупрозрачности). Берите базу и файлы из 10701376 . Из базы понадобится класс cAlphaDibSection. Понадобится также такой модуль:
Код: 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.
Option Explicit

Private Enum BOOL
   FALSE_BOOL
   TRUE_BOOL
End Enum

Private Type BITMAP '24 bytes
   bmType As Long
   bmWidth As Long
   bmHeight As Long
   bmWidthBytes As Long
   bmPlanes As Integer
   bmBitsPixel As Integer
   bmBits As Long
End Type

Private Declare Function GetObjectA Lib "gdi32" ( _
   ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function DeleteObject Lib "gdi32" ( _
   ByVal hObject As Long) As Long
Private Enum GdiObjectType
   OBJ_BITMAP =  7 
End Enum
Private Declare Function GetObjectType Lib "gdi32" ( _
   ByVal hgdiobj As Long) As GdiObjectType

Private Declare Function CreateBitmap Lib "gdi32" ( _
   ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, _
   ByVal nBitCount As Long, lpBits As Any) As Long

Private Type ICONINFO
   fIcon As BOOL
   xHotspot As Long
   yHotspot As Long
   hbmMask As Long
   hbmColor As Long
End Type
Private Declare Function CreateIconIndirect Lib "user32" ( _
   piconinfo As ICONINFO) As Long

Private Enum PICTYPE
   PICTYPE_UNINITIALIZED = - 1 
   PICTYPE_NONE =  0 
   PICTYPE_BITMAP =  1 
   PICTYPE_METAFILE =  2 
   PICTYPE_ICON =  3 
   PICTYPE_ENHMETAFILE =  4 
End Enum

Private Type GUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4( 0  To  7 ) As Byte
End Type

Private Type picIcon
   Size As Long
   Type As PICTYPE
   hIcon As Long
   Reserved1 As Long
   Reserved2 As Long
End Type

Private Declare Function OleCreatePictureIndirect Lib "olepro32" ( _
   PicDesc As Any, RefIID As GUID, _
   ByVal fPictureOwnsHandle As BOOL, IPic As IPictureDisp) As Long

Public Function CreateIPictureDispFromHICON( _
   ByVal hIcon As Long, _
   Optional ByVal fPictureOwnsHandle As Boolean = True) As IPictureDisp
 Dim IID_IDispatch As GUID
 Dim Pic As picIcon
 With Pic
    .Size = Len(Pic)
    .Type = PICTYPE_ICON
    .hIcon = hIcon
 End With
 With IID_IDispatch
    .Data1 = &H20400
    .Data4( 0 ) = &HC0
    .Data4( 7 ) = &H46
 End With
 OleCreatePictureIndirect Pic, IID_IDispatch, -fPictureOwnsHandle, _
                          CreateIPictureDispFromHICON
End Function

Public Function CreateAlphaIcon(ByVal hbmpARGB As Long) As IPictureDisp
 Dim cbSize As Long
 Dim cbCopied As Long
 Dim bmARGB As BITMAP
 Dim hbmpMono As Long
 Dim ii As ICONINFO
 Dim hiconAlpha As Long
 
 If GetObjectType(hbmpARGB) <> OBJ_BITMAP Then Exit Function
 cbSize = LenB(bmARGB)
 cbCopied = GetObjectA(hbmpARGB, cbSize, bmARGB)
 If cbSize <> cbCopied Then Exit Function
 
 hbmpMono = CreateBitmap(bmARGB.bmWidth, bmARGB.bmHeight,  1 ,  1 , ByVal  0 &)
 ii.fIcon = TRUE_BOOL
 ii.xHotspot =  0 
 ii.yHotspot =  0 
 ii.hbmMask = hbmpMono
 ii.hbmColor = hbmpARGB
 hiconAlpha = CreateIconIndirect(ii)
 DeleteObject hbmpMono
 
 If hiconAlpha =  0  Then Exit Function
 Set CreateAlphaIcon = CreateIPictureDispFromHICON(hiconAlpha)
End Function
Использование:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub Test
 Dim cImg As New cAlphaDibSection
 Dim cMsk As New cAlphaDibSection
 'Берём 24-битный цветной битмап
 cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
 'Берём отдельный битмап с альфа-каналом (оттенки серого)
 cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
 'Складываем
 cImg.ApplyAlphaChannel cMsk 'Получили 32-битный битмап с альфа-каналом
 
 'Сохраняем, если нужно
 'cImg.SavePicture CurrentProject.Path & "\point-blue-argb.bmp"
 'На стандартные LoadPicture, SavePicture не надейтесь

 'Создаём из битмапа иконку, завёрнутую в IPictureDisp
 Dim picIcon As IPictureDisp
 Set picIcon = CreateAlphaIcon(cImg.hDib)

 'Далее пытаемся применить в Ribbon или ещё где
 '...
End Sub
Ну, и рассказываете, что получилось.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309525
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Бенедикт! Ну, у Вас и код! Я там ничего не понял ;(пока нет времени разбираться),
Короче, сделал AS IS.

Вот процедура, вызываемая Риббоном - она НЕ СРАБОТАЛА.
Причем ошибок не выдает, а иконка на кнопке - пустая.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Sub GetImage32(Control, ByRef image)
  Dim cImg As New cAlphaDibSection
  Dim cMsk As New cAlphaDibSection
 
  cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
  cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
  cImg.ApplyAlphaChannel cMsk
  'cImg.SavePicture CurrentProject.Path & "\point-blue-argb.bmp"
 
  Dim picIcon As IPictureDisp
  Set picIcon = CreateAlphaIcon(cImg.hDib)

  Set image = picIcon 
End Sub

Попробовал записать иконку в файл и загрузить из файла в Рибоон,
и все ПОЛУЧИЛОСЬ, с прозрачностью
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Sub GetImage32(Control, ByRef image)
  Dim cImg As New cAlphaDibSection
  Dim cMsk As New cAlphaDibSection
 
  cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
  cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
 
  cImg.ApplyAlphaChannel cMsk
  cImg.SavePicture CurrentProject.Path & "\point-blue-argb.bmp"
 
  'Dim picIcon As IPictureDisp
  'Set picIcon = CreateAlphaIcon(cImg.hDib)

 Set image = LoadPicture(CurrentProject.Path & "\point-blue-argb.bmp")
End Sub

Значит мы на верном пути. Вот это видать не работает
Код: plaintext
1.
 Dim picIcon As IPictureDisp
 Set picIcon = CreateAlphaIcon(cImg.hDib)

Теперь вопрос, как получить объект IPictureDisp из переменной cImg , чтобы избежать записи в файл?
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309547
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuskТеперь вопрос, как получить объект IPictureDisp из переменной cImg , чтобы избежать записи в файл?Функцией CreateIPictureDispFromHBITMAP выше по теме.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309556
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
третьим параметром ей указывайте False.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309605
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,
Не очень хорошо получается с третьим параметром, отвечающим за владение GDI-объектом (битмапом). Если владельцем оставлять экземпляр cAlphaDibSection (третий параметр равен False), то нужно, чтобы этот экземпляр был "жив", пока используется IPictureDisp, оборачивающий битмап. Если владельцем делать IPictureDisp (True), то нужно, чтобы деструктор cAlphaDibSection.Class_Terminate не уничтожал битмап.
Сделайте так: введите в cAlphaDibSection свойство, отвечающее за (не)выполнение строчки DeleteObject m_hDIb в методе ClearUp, и вызывайте CreateIPictureDispFromHBITMAP с третьим параметром, равным True (значение по умолчанию).
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309623
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БенедиктRusk,
Не очень хорошо получается с третьим параметром, отвечающим за владение GDI-объектом (битмапом). Если владельцем оставлять экземпляр cAlphaDibSection (третий параметр равен False), то нужно, чтобы этот экземпляр был "жив", пока используется IPictureDisp, оборачивающий битмап. Если владельцем делать IPictureDisp (True), то нужно, чтобы деструктор cAlphaDibSection.Class_Terminate не уничтожал битмап.
Сделайте так: введите в cAlphaDibSection свойство, отвечающее за (не)выполнение строчки DeleteObject m_hDIb в методе ClearUp, и вызывайте CreateIPictureDispFromHBITMAP с третьим параметром, равным True (значение по умолчанию).

Извините за может быть глупый вопрос, а что передавать в первом и втором параметре?
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309649
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,

В первом передавать cImg.hDib. Во втором 0 или ничего (опускать параметр).
Попробуйте для начала без изменений в классе сделать просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Sub GetImage32(Control, ByRef image)
 Dim cImg As New cAlphaDibSection
 Dim cMsk As New cAlphaDibSection
 
 cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
 cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
 
 cImg.ApplyAlphaChannel cMsk

 Set image = CreateIPictureDispFromHBITMAP(cImg.hDib,  0 , False)
End Sub
и заставить Ribbon затем перерисоваться (поместить сверху какое-то окно, а затем убрать, например). Возможно, Ribbon делает копию битмапа в себе, тогда его можно спокойно убивать в своём коде.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309655
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще, хорошо бы было бы оформить получение IPictureDisp ,
как метод (функция) класса cAlphaDibSection .
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309681
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БенедиктRusk,

В первом передавать cImg.hDib. Во втором 0 или ничего (опускать параметр).
Попробуйте для начала без изменений в классе сделать просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Sub GetImage32(Control, ByRef image)
 Dim cImg As New cAlphaDibSection
 Dim cMsk As New cAlphaDibSection
 
 cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
 cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
 
 cImg.ApplyAlphaChannel cMsk

 Set image = CreateIPictureDispFromHBITMAP(cImg.hDib,  0 , False)
End Sub


Получается пустое место - вместо иконки.

А насчет,
Бенедикти заставить Ribbon затем перерисоваться (поместить сверху какое-то окно, а затем убрать, например). Возможно, Ribbon делает копию битмапа в себе, тогда его можно спокойно убивать в своём коде.
По-видимому, Ribbon действительно делает копию битмапа себе, потому что функция GetImage32 вызывается только один раз.
Только вызов его метода Invalidate, вызывает перезапрос картинок.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309684
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,

Вы это можете сделать за 10-15 секунд самостоятельно.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309699
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БенедиктRusk,

Вы это можете сделать за 10-15 секунд самостоятельно.

Осталось только заставить работать CreateIPictureDispFromHBITMAP ...
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309720
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,
раз пустое место, значит... ничего не значит. Что за параметры (Control, ByRef image), и как вызывается функция GetImage32? Где и как происходит передача IPictureDisp в Ribbon?
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309761
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, сделаем шаг назад. Вот это отлично работает:
Rusk...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Sub GetImage32(Control, ByRef image)
  Dim cImg As New cAlphaDibSection
  Dim cMsk As New cAlphaDibSection
 
  cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
  cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
 
  cImg.ApplyAlphaChannel cMsk
  cImg.SavePicture CurrentProject.Path & "\point-blue-argb.bmp"
 
 Set image = LoadPicture(CurrentProject.Path & "\point-blue-argb.bmp")
End Sub
Теперь вопрос, как получить объект IPictureDisp из переменной cImg , чтобы избежать записи в файл?
БенедиктRusk,
раз пустое место, значит... ничего не значит. Что за параметры (Control, ByRef image), и как вызывается функция GetImage32? Где и как происходит передача IPictureDisp в Ribbon?
Короче, Риббон создается и загружается ввиде xml-строки при открытии базы
Код: 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.
Function CreateRibbonButtons()
  Dim xml As String
  xml = _
   "<customUI xmlns=""http://schemas.microsoft.com/" & _
   "office/2006/01/customui"" onLoad=""MyRibbonLoad"">" & vbCrLf & _
   "  <ribbon startFromScratch=""false"">" & vbCrLf & _
   "    <tabs>" & vbCrLf & _
   "      <tab id=""myTab"" label=""Test"">" & _
     vbCrLf & _
   "        <group id=""twoButtons"" label=""Test Buttons"">" & _
     vbCrLf & _
   "            <button id=""btnMain"" label=""Button 1"" size=""large"" imageMso=""HappyFace"" onAction=""=ButtonMainOnActionCallBack()""/>" & _
    vbCrLf & _
    "            <button id=""btnNeighbour"" label=""Button 2"" size=""large"" imageMso=""HappyFace"" getEnabled=""NeighbourGetEnableCallBack""/>" & _
    vbCrLf & _
    "            <separator id=""sepTest""/>" & vbCrLf & _


    "            <button id=""btnTest3"" label=""Button 3"" size=""large"" getImage=""GetImage32"" />" & _ 


    vbCrLf & _
   "        </group>" & vbCrLf & _
   "      </tab>" & vbCrLf & _
   "    </tabs>" & vbCrLf & _
   "  </ribbon>" & vbCrLf & _
   "</customUI>"
  
  Debug.Print xml
  Application.LoadCustomUI "MyRibbon", xml
  
End Function

Обратите внимание на строчку, начинающуюся <button id=""btnTest3""
А дальше по тексту идет вышеуказанная функция GetImage32, которую Риббон вызывает при необходимости нарисовать картинку для кнопки btnTest3. При этом передает в первом параметре - IRibbonControl, собственно, сам объект кнопки, а второй параметр - ByRef image AS IPictureDisp, куда надо передать объект картинки.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309773
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем, осталось вот это разрулить, без файла
Код: plaintext
1.
2.
3.
  cImg.SavePicture CurrentProject.Path & "\point-blue-argb.bmp"
 
  Set image = LoadPicture(CurrentProject.Path & "\point-blue-argb.bmp")
У меня знаний по GDI API BITMAP - нема, к сожалению :(
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309777
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,
Понятно, спасибо.
Давайте тогда по второму варианту.
В класс внесите следующие изменения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 'в области описаний
 Public DeleteDibOnTerminate As Boolean

 'новый метод
Private Sub Class_Initialize()
 DeleteDibOnTerminate = True
End Sub

'В методе ClearUp
Public Sub ClearUp()
'...
    'Вместо DeleteObject m_hDIb:
    If DeleteDibOnTerminate Then DeleteObject m_hDIb
'...
End Sub
Использование
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Sub GetImage32(Control, ByRef image)
 Dim cImg As New cAlphaDibSection
 Dim cMsk As New cAlphaDibSection
 
 cImg.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue.bmp")
 cMsk.CreateFromPicture LoadPicture(CurrentProject.Path & "\point-blue-alpha.bmp")
 
 cImg.ApplyAlphaChannel cMsk
 cImg.DeleteDibOnTerminate = False

 Set image = CreateIPictureDispFromHBITMAP(cImg.hDib)
End Sub
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309822
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
УРА, ПОЛУЧИЛОСЬ!!!!
Большущее СПАСИБО, Бенедикт!

Теперь, можно будет замутить, что-нибудь, типа загрузки картинок в Риббон из таблицы, предварительно, сохранив туда файлы bmp и их "альфа-маски". Тут на форуме, что-то видел с ключевым словом BLOB...

Прикладываю файл, наших экспериментов, для всех интересующихся.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37309858
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,

пожалуйста.

Тогда легче сразу результирующий 32-битный битмап хранить в таблице. Собственно, в той же базе функция LoadPictureUsingStream() служит для получения IPictureDisp из байтового массива. А уж байтовый массив считать из BLOB-а задача тривиальная.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37314609
Rusk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Бенедикт,

Вот нашел я коллекцию .png картинок с альфа-каналом, что-то не получается их загрузить в Access.
LoadPicture - ругается - Invalid Picture. А при сохранении в Paint (Win7), как BMP - теряется прозрачность (о чем и появляется предупреждение).

Как загрузить .png ума не приложу?

Спасибо за ответ.
...
Рейтинг: 0 / 0
Рисунок для набора вкладок
    #37316993
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rusk,

загрузить .PNG можно с помощью GDI+. По идее, всё должно быть просто, но проверяйте:
Код: 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.
Option Explicit

Private Enum BOOL
   FALSE_BOOL
   TRUE_BOOL
End Enum

Private Enum GpStatus 'GDI+ Status
   OK =  0 
   GenericError =  1 
   InvalidParameter =  2 
   OutOfMemory =  3 
   ObjectBusy =  4 
   InsufficientBuffer =  5 
   NotImplemented =  6 
   Win32Error =  7 
   WrongState =  8 
   Aborted =  9 
   FileNotFound =  10 
   ValueOverflow =  11 
   AccessDenied =  12 
   UnknownImageFormat =  13 
   FontFamilyNotFound =  14 
   FontStyleNotFound =  15 
   NotTrueTypeFont =  16 
   UnsupportedGdiplusVersion =  17 
   GdiplusNotInitialized =  18 
   PropertyNotFound =  19 
   PropertyNotSupported =  20 
   ProfileNotFound =  21 
End Enum

Private Enum GdiplusVersion
   Ver1 =  1 
End Enum

Private Type GdiplusStartupInput
   GdiplusVersion As GdiplusVersion
   DebugEventCallback As Long
   SuppressBackgroundThread As BOOL
   SuppressExternalCodecs As BOOL
End Type

Private Declare Function GdiplusStartup Lib "gdiplus" ( _
   lToken As Long, lpInput As GdiplusStartupInput, _
   Optional ByRef lpOutput As Any) As GpStatus
Private Declare Function GdiplusShutdown Lib "gdiplus" ( _
   ByVal lToken As Long) As GpStatus

Private Declare Function GdipCreateBitmapFromFile Lib "gdiplus" ( _
   ByVal wszFileName As Long, nBitmap As Long) As GpStatus
'Private Declare Function GdipCreateBitmapFromStream Lib "gdiplus" ( _
'   ByVal Stream As IUnknown, nBitmap As Long) As GpStatus
Private Declare Function GdipCreateHBITMAPFromBitmap Lib "gdiplus" ( _
   ByVal nBitmap As Long, hbmReturn As Long, _
   ByVal argbBackground As Long) As GpStatus
Private Declare Function GdipDisposeImage Lib "gdiplus" ( _
   ByVal nImage As Long) As GpStatus

Public Function LoadBitmapPicture(ByVal sFileName As String) As IPictureDisp
 Dim GdipToken As Long
 Dim si As GdiplusStartupInput
 Dim nBitmap As Long
 Dim hBitmap As Long
 si.GdiplusVersion = Ver1
 GdiplusStartup GdipToken, si, ByVal  0 &
 If GdipToken =  0  Then Exit Function
 GdipCreateBitmapFromFile StrPtr(sFileName), nBitmap
 If nBitmap Then
    GdipCreateHBITMAPFromBitmap nBitmap, hBitmap,  0 
    Set LoadBitmapPicture = CreateIPictureDispFromHBITMAP(hBitmap)
    GdipDisposeImage nBitmap
 End If
 GdiplusShutdown GdipToken
End Function
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рисунок для набора вкладок
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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