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