GDI Handle im Picture Gewand
API Picture Handle in VB freundliche Picture Objekte konvertieren
Arbeitet man mit dem GDI API, erhält man nur einen Handle einer Grafik. Um diese zum Vorschein zu bringen, braucht man einen Gerätekontext, was die Wahl der Zielobjekte einschränkt. Zwei COM Aufrufe sorgen dafür, dass aus diesem Handle ein VB freundliches Picture Objekt erzeugt wird.
Wenn Sie mit den GDI API Funktionen arbeiten, haben Sie nur einen Handle zum Bild und benötigen einen Gerätekontext (hDC) in dem dieses Bild ausgegeben werden kann. Das schlanke Image-Steuerelement scheidet so zum Beispiel als direktes Ausgabemedium aus, da es über keine hDC-Eigenschaft verfügt.
Der direkte Weg zum Picture-Objekt führt über die COM API Funktion OleCreatePictureIndirect, die aus dem Handle, der Information über den Typ des Bilds und der Interface ID (IID/GUID) des VB Picture Objekts, ein neues Picture Objekt erzeugt.
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(8) As Byte
End Type
Private Type PICTDESC
cbSize As Long
picType As Long
hImage As Long
xExt As Long
yExt As Long
End Type
Private Declare Function IIDFromString Lib "ole32" _
(ByVal lpsz As String, ByRef lpiid As GUID) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32" _
(ByRef pPictDesc As PICTDESC, ByRef riid As GUID, _
ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long
Private Const S_OK = 0
Private Const IPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
Public Function HandleToPicture(ByVal hImage As Long, _
ByVal ImageType As PictureTypeConstants) As IPicture
Dim tIID As GUID
Dim tPICTDEST As PICTDESC
Dim lRet As Long
If (hImage = 0) Then Exit Function
lRet = IIDFromString(StrConv(IPictureIID, vbUnicode), tIID)
If (lRet = S_OK) Then
With tPICTDEST
.cbSize = Len(tPICTDEST)
.picType = ImageType
.hImage = hImage
End With
lRet = OleCreatePictureIndirect(tPICTDEST, tIID, True, HandleToPicture)
If (lRet <> S_OK) Then Set HandleToPicture = Nothing
End If
End Function