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


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