|
|
|
|
|
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 OleCreatePictureIndirect
zur Verfügung. Wie der Name der Funktion schon andeutet, erzeugt
diese Funktion indirekt ein Picture-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) PICTDESC
und GUID sowie die Deklaration der zusätzlich benötigten
API-Funktion IIDFromString
finden Sie in unserem Modul modPictureFromHandle.
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 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 HRESULT-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 Err.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

|

|
|
|