Rubrik: Grafik und Font · Bilder & Icons | VB-Versionen: VB5, VB6 | 08.12.03 |
Beliebige Bilder aus Ressourcen-Datei laden und anzeigen Dieser Tipp zeigt, wie sich beliebige Bilder (auch 16x16 Icon, GIF und JPG) aus einer Ressourcen-Datei laden und anzeigen lassen. | ||
Autor: Dieter Otter | Bewertung: | Views: 34.772 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Vor langer langer Zeit haben wir Ihnen schon einmal eine Lösung aufgezeigt, wie sich GIF- oder JPG-Bilder aus einer Ressourcen-Datei laden und anzeigen lassen. Über die VB-Funktion LoadResPicture lassen sich bekanntlich nur 32x32 Icons und BMP-Bilder aus der RES-Datei auslesen. Für andere Bildformate muss man auf die LoadResData-Funktion zurückgreifen, die den Inhalt in ein Byte-Array einliest. Dieses Byte-Array hatten wir dann in eine Datei gespeichert, so dass das Bild dann über die LoadPicture-Anweisung in einer PictureBox oder einem Image-Control angezeigt werden konnte.
Dass es auch ohne das "umständliche" Zwischenspeichern in eine temporäre Datei geht, das möchten wir Ihnen heute zeigen. Nachfolgender Tipp basiert auf unseren Extra-Tipp Dezember 2003 von LonelySuicide: Bild laden - mit Fortschrittsanzeige
Hier wurde sehr schön gezeigt, wie sich ein im Speicher (Memory) befindliches Bild mit Hilfe der API-Funktionen CreateStreamOnHGlobal und OleLoadPicture in ein StdPicture-Objekt auslesen lässt.
Erstellen Sie zunächst eine RES-Datei, mit folgendem Aufbau:
// RTF-Dokumente 1000 ICO DISCARDABLE "icon16x16.ico" // JPG-Bilder 2000 JPG DISCARDABLE "cd.jpg" // GIF-Bilder 3000 GIF DISCARDABLE "logo.gif"
Diese Datei wird nun mit Hilfe des Microsoft Ressourcen-Compiler zu einer .RES-Datei kompiliert und muss dem VB-Projekt hinzugefügt werden.
Die neue LoadImageFromRES-Funktion fügen Sie am besten in ein Modul ein:
Option Explicit ' Benötigte API-Deklarationen Private Declare Function CreateStreamOnHGlobal Lib "ole32.dll" ( _ ByVal hGlobal As Long, _ ByVal fDeleteOnRelease As Long, _ lpIStream As IUnknown) As Long Private Declare Function OleLoadPicture Lib "oleaut32.dll" ( _ ByVal lpStream As IUnknown, _ ByVal lSize As Long, _ ByVal fRunmode As Long, _ riid As Any, _ lpIPicture As IPicture) As Long
' Bild aus RES-Datei laden und ' als StdPicture-Objekt zurückgeben Public Function LoadImageFromRES(ByVal nResID As Long, sType) As StdPicture Dim IID_IPicture(3) As Long Dim oPicture As IPicture Dim bImg() As Byte Dim nResult As Long Dim oStream As IUnknown Dim hGlobal As Long ' Bild als ByteArray aus RES-Datei laden bImg = LoadResData(nResID, sType) ' Array füllen um den KlassenID (CLSID) IID_IPICTURE ' zu simulieren IID_IPicture(0) = &H7BF80980 IID_IPicture(1) = &H101ABF32 IID_IPicture(2) = &HAA00BB8B IID_IPicture(3) = &HAB0C3000 ' Stream erstellen Call CreateStreamOnHGlobal(VarPtr(bImg(LBound(bImg))), 0, oStream) ' OLE IPicture-Objekt erstellen nResult = OleLoadPicture(oStream, 0, 0, IID_IPicture(0), oPicture) If nResult = 0 Then Set LoadImageFromRES = oPicture End If End Function
Der Aufruf erfolgt so:
Set Image1.Picture = LoadImageFromRES(1000, "ICO")
Set Image1.Picture = LoadImageFromRES(2000, "JPG")
Set Image1.Picture = LoadImageFromRES(3000, "GIF")