RSS
StartseiteKnowledge LibraryTop 10Impressum

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