- Код: Выделить всё
Public Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Public Type PictDesc
cbSizeofStruct As Long
picType As Long
hImage As Long
xExt As Long
yExt As Long
End Type
Public Const IMAGE_BITMAP As Long = 0
Public Const IMAGE_ICON As Long = 1
Public Const IMAGE_CURSOR As Long = 2
Public Const PICTYPE_BITMAP As Long = 1
Public Const PICTYPE_ICON As Long = 3
'[LoadImage]
Public Declare Function LoadImage _
Lib "user32.dll" _
Alias "LoadImageA" _
( _
ByVal hInst As Long, _
ByVal lpsz As String, _
ByVal un1 As Long, _
ByVal n1 As Long, _
ByVal n2 As Long, _
ByVal un2 As Long _
) As Long
'[OleCreatePictureIndirect]
Public Declare Function OleCreatePictureIndirect _
Lib "olepro32.dll" _
( _
ByRef PicDesc As PictDesc, _
ByRef RefIID As GUID, _
ByVal fPictureOwnsHandle As Long, _
ByRef IPic As IPicture _
) As Long
'[LoadResIcon]
'========================================================================================================
'ЗАГРУЖАЕТ ИЗОБРАЖЕНИЕ ИКОНКИ ИЗ РЕСУРСОВ
'========================================================================================================
Public Function LoadResIcon(ByVal sIdIcon As String) As IPictureDisp
Dim hImage As Long
Dim Pic As PictDesc
Dim IID_IDispatch As GUID
If Len(sIdIcon) > 0 Then
'Идентификатор иконки должен начинаться со знака '#' поэтому производится проверка
'и если этот знак отсутствует, то он добавляется и строка приводится к нужному виду.
If Asc(sIdIcon) <> 35 Then sIdIcon = "#" & sIdIcon
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
hImage = LoadImage(App.hInstance, sIdIcon, IMAGE_ICON, 48, 48, LR_DEFAULTSIZE)
If hImage > 0 Then
With Pic
.picType = PICTYPE_ICON
.hImage = hImage
End With
Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, LoadResIcon)
End If
End If
End Function
И сразу грабли. Такой вариант работает только в скомпилированном виде. При при запуске и отладке по IDE Функция LoadImage ищет ресурсы самого VB IDE. Оно и понятно. Встроенные функции VB работают одинаково хорошо, хоть под IDE хоть в скомпилированном виде. Видимо при работе под IDE ресурсы загружаются непосредственно из фаила ресурсов (*.res). К сожалению для работы с новыми иконками и изображениями PNG они не годятся.
А теперь собственно вопрос. Как можно сделать универсальный вариант, чтобы работал одинаково хорошо и в IDE и в скомпилированном виде.