vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Grafik und Font · Bilder & Icons   |   VB-Versionen: VB5, VB608.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 OtterBewertung:  Views:  34.753 
www.tools4vb.deSystem:  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")



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.