ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 09.03.2000

Diese Seite wurde zuletzt aktualisiert am 09.03.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Vom Handle zum Picture

Zurück...


Anzeige

Von Martin Szugat mailto:ms_picturefromhandle@aboutvb.de

Als es noch kein COM und folglich keine Objekte in der Welt von Windows gab, waren Handles der letzte Schrei. Es gab Handles für Fenster, für Dateien, für Bitmaps und eigentlich für jeden Teil des Betriebssystems. Doch trotz des Erfolges von COM verwendet das Windows-API in den meisten Fällen nach wie vor Handles anstatt Objekte. Im Gegensatz zum Windows-API bevorzugt Visual Basic jedoch Objekte.

Zur Umwandlung eines Handles in ein Objekt gibt es keine allgemeine API-Funktion. Je nach Typ des Handles müssen Sie eine spezialisierte Funktion bemühen, um aus dem Handle ein Objekt zu machen. Für Handles von Bitmaps und Icons stellt COM die Funktion MSDN Library - API OleCreatePictureIndirectOleCreatePictureIndirect zur Verfügung. Wie der Name der Funktion schon andeutet, erzeugt diese Funktion indirekt ein MSDN Library - VB StdPicturePicture-Objekt. Indirekt bedeutet in diesem Fall, dass der Funktion ein Handle eines bereits im Speicher vorhandenen Bilds übergeben wird und sie das Handle in ein Picture-Objekt überführt, das das Bild enthält.

Der Aufruf der OleCreatePictureIndirect-Funktion ist allerdings mit einigen Schwierigkeiten verbunden, die es zu lösen gilt. Schon bei der Deklaration der OleCreatePictureIndirect-Funktion werden Sie von Visual Basic im Stich gelassen, denn der API-Viewer hält keine vorgefertigte Deklaration für Sie bereit. Aber keine Bange: Die Deklaration der Funktion, die für die Parameter der OleCreatePictureIndirect-Funktion erforderlichen benutzerdefinierten Variablen (Struktur-Variablen) MSDN Library - API PICTDESCPICTDESC und GUID sowie die Deklaration der zusätzlich benötigten API-Funktion MSDN Library - API IIDFromStringIIDFromString finden Sie in unserem Modul Download modPictureFromHandle.basmodPictureFromHandle. Die Struktur PICTDESC dient der Beschreibung eines Bildes und nimmt den Typ und das Handle eines Bildes auf. Die Bedeutung des Typs GUID und der Funktion IIDFromString dürfte Ihnen spätestens nach der (bisher versäumten?) Lektüre des Artikels GUIDs für jeden ZweckGUIDs für jeden Zweck klar sein.

Die COM-typischen (und eher Visual Basic-untypischen) Details des Aufrufs der OleCreatePictureIndirect-Funktion kapseln wir auf benutzerfreundliche Weise in der Hilfs-Funktion PictureFromHandle. Die Funktion erwartet das Handle des Bildes - zum Beispiel als hIcon, hBitmap oder hMetafile - sowie den Typ des Bildes als PictureType-Konstante. Über den letzten und optionalen Parameter PictureOwnsHandle kann festgelegt werden, wer die Kontrolle über das Handle besitzt. Falls dieser Parameter ignoriert wird oder als False gesetzt wird (Voreinstellung), bleibt die Verantwortung für das Handle auch nach dem Erzeugen des Picture-Objekts bei dem Programm - mit anderen Worten: das Programm ist für die Freigabe des Handles zuständig. Soll dem Picture-Objekt die Verantwortung übertragen werden, übergeben Sie im Parameter PictureOwnsHandle True. Was es mit dieser Verantwortung auf sich hat? Nun, wenn Sie es bereits geschafft haben, ein Bild-Handle (weswegen wir ja diesen ganzen Zauber hier veranstalten) in die Finger zu bekommen, werden Sie auch wissen, was es damit auf sich hat...

Die COM-typischen Details, von denen eben die Rede war, bestehen zunächst darin, eine PICTDESC-Struktur mit der Größe der Struktur, dem Handle und der PictureType-Konstante zu füllen. Außerdem wird noch eine GUID-Struktur mit dem so genannten "Interface Identifier" (IID) der Picture-Schnittstelle belegt, indem die IIDFromString-Funktion mit dem "Klartext"-GUID der Schnittstelle (lokale Konstante kPictureIID) als Parameter aufgerufen wird. Dieser IID teilt der OleCreatePictureIndirect-Funktion mit, welche Schnittstelle des Picture-Objekts referenziert und an den Aufrufer zurückgegeben werden soll. Als Rückgabewert liefert die IIDFromString-Funktion wie jede COM-Funktion einen MSDN Library - API HRESULTHRESULT-Wert. Ein HRESULT ist selbst wiederum eines dieser Handles, diesmal für Status- und Fehlermeldungen. Falls der Wert des HRESULT-Handles ungleich Null ist, ist bei der Konvertierung der Zeichenfolge in einen IID durch die IIDFromString-Funktion ein Fehler aufgetreten. Diesen Fehler reichen wir dann über einen MSDN Library - VB Err.RaiseErr.Raise-Aufruf an den Aufrufer unserer Funktion PictureFromhandle als Laufzeitfehler weiter.

Anschließend folgt der entscheidende Aufruf der OleCreatePictureIndirect-Funktion. Hierbei werden die PICTDESC-Struktur, die GUID-Struktur, der Parameter PictureOwnsHandle und die Variable nPicture des Objekt-Datentyps Picture übergeben. War der Aufruf der Funktion erfolgreich, enthält die Variable nPicture eine Referenz auf die Picture-Schnittstelle des Picture-Objekts - kurz gesagt: die Referenz auf ein Picture-Objekts. Andernfalls ist der von der OleCreatePictureIndirect-Funktion zurückgelieferte HRESULT-Wert ungleich Null und die PictureFromHandle-Funktion leitet den Fehler wiederum per Err.Raise an den Aufrufer weiter. Die erfolgreich erzeugte Referenz auf das Picture-Objekt wird zum Schluss als Rückgabewert der PictureFromHandle-Funktion gesetzt.

Private Type PICTDESC
  cbSizeofStruct As Long
  PicType As Long
  hImage As Long
  xExt As Long
  yExt As Long
End Type

Private Type GUID
  Part1 As Long
  Part2 As Integer
  Part3 As Integer
  Part4 As Integer
  Part5(1 To 6) As Byte
End Type

Private Declare Function OleCreatePictureIndirect Lib "Olepro32" _
 (ByRef pPictDesc As PICTDESC, ByRef RIID As GUID, _
 ByVal fOwn As Long, ByRef ppvObj As Any) As Long
Private Declare Function IIDFromString Lib "OLE32" _
 (ByVal lpsz As String, ByRef lpiid As GUID) As Long

Public Function PictureFromHandle(ByVal Handle As Long, _
 ByVal PictureType As PictureTypeConstants, _
 Optional ByVal PictureOwnsHandle As Boolean = False) _
 As StdPicture

  Dim nPicture As Picture
  Dim nPictDesc As PICTDESC
  Dim nIID As GUID
  Dim nHResult As Long
  
  Const kPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"

  With nPictDesc
    .cbSizeofStruct = Len(nPictDesc)
    .PicType = PictureType
    .hImage = Handle
  End With
  nHResult = IIDFromString(StrConv(kPictureIID, vbUnicode), nIID)
  If nHResult Then
    Err.Raise nHResult
  Else
    nHResult = OleCreatePictureIndirect(nPictDesc, nIID, _
     PictureOwnsHandle, nPicture)
    If nHResult Then
      Err.Raise nHResult
    Else
      Set PictureFromHandle = nPicture
    End If
  End If
End Function

Die Funktion PictureFromHandle verwandelt ein vorhandenes Bild-Handle in ein Picture-Objekt


Modul modPictureFromHandle.bas (modPictureFromHandle.bas - ca. 1,6 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer