PNGs in toolbars laden

09/08/2011 - 10:17 von Karl Honig | Report spam
Hallo zusammen!

Nachdem ich herausgefunden habe, dass die toolbars der Common Controls 5
ohne Problem mit Transparenzen umgehen koennen (InitCommonControls
vorausgesetzt) moechte ich gern direkt PNGs dafuer verwenden.
Im Moment verwende ich BMPs mit 32bit.
Das Wandeln moechte ich mir und den Nutzern sparen.

Zunaechst fuelle ich eine imagelist mit den Bildern:

Dim P As String
P = App.Path & "\icons\"

Dim imgX As ListImage
Set imgX = imgl_24.ListImages.Add(, "bildkey1", LoadPicture(P &
"bild1.bmp"))

Dann weise ich Bilder und keys der toolbar zu:

toolbar1.ImageList = imgl_24

Dim btnX As Button

Set btnX = toolbar1.Buttons.Add(, "buttonkey1", , 0, "bildkey1")
btnX.ToolTipText = "Tooltip1"

Funktioniert alles.

Was ich nun will ist LoadPicture() durch eine Funktion ersetzen, die
direkt PNGs aus einer Datei oder alternativ aus einer resource laedt und
dieselben Daten hergibt wie das BMP/32-Format.

Es muesste vielleicht mit der vbpng1.dll gehen...

Hat jemand ne Idee, wie das anzugehen ist?
Oder sogar ein Beispiel parat?

Danke und einen schoenen Tag noch,
Karl
 

Lesen sie die antworten

#1 Schmidt
09/08/2011 - 12:57 | Warnen spam
Am 09.08.2011 10:17, schrieb Karl Honig:

[PNG to StdPicture]
Was ich nun will ist LoadPicture() durch eine Funktion ersetzen, die
direkt PNGs aus einer Datei oder alternativ aus einer resource laedt und
dieselben Daten hergibt wie das BMP/32-Format.

Es muesste vielleicht mit der vbpng1.dll gehen...



Geht mi Sicherheit auch mit der FreeImageDll -
oder mit GDI+ (mit ein paar "zu Fuß"-Zwischenoperationen,
um den 32Bit-DIBSection-Output per StdPicture
in Deine ImageList zu bekommen.

Wenn Dich die ca. 1.5MB (komprimiertes) Deployment-
Volumen nicht stören, dann könntest Du auch
RichClient4 einsetzen für diese AUfgabe.

Gegenüber der àlteren dhCairo.dll haben die
neuen Cairo-ImageSurfaces jetzt auch eine
Picture-Property, welche 32Bit DIB-Sections
im StdPicture-Objekt (als Kopie der Cairo-
ImageSurface) zurückgeben können.

Bei registriertem RC4 sollte folgendes
(in einer Test-Form) eigentlich schon genügen
(nur so als Einstieg):

Private Sub Form_Load()
Dim New_c As New cConstructor, Cairo As cCairo
Set Cairo = New_c.Cairo

Dim Pic As StdPicture, FileNameOrByteArray
FileNameOrByteArray = "C:\Code\vbRichClient4\test.png"
Set Pic = Cairo.CreateSurface(0,0, , FileNameOrByteArray).Picture

Set Form1.Picture = Pic
End Sub

Zur Erklàrung, die Zeile:
Cairo.CreateSurface(0,0, , FileNameOrByteArray)
gibt eine Cairo-ImageSurface zurück.
Anstelle der direkten Rückgabe (Dank Picture-Property):
Cairo.CreateSurface(0,0, , FileNameOrByteArray).Picture

hàtte man also auch "gespràchiger" hinschreiben können:
Dim Srf As cCairoSurface
Set Srf = Cairo.CreateSurface(0,0, , FileNameOrByteArray)
Dim Pic As StdPicture
Set Pic = Srf.Picture 'erzeugt eine Kopie des Srf-Contents in Pic


FileNameOrByteArray kann jedenfalls entweder Dein Png-COntent
in FOrm eines VB-ByteArrays sein, oder der (absolute, mit Pfad)
FileName zu diesem Png-Image. Ebenfalls "verstanden"
werden: *.gif, *.jpg, *.bmp, *.svg, *.svgz" entweder in
ByteArray-representation oder als FileName.

Über die globale Cairo.Imagelist.Add___ Funktionalitàt
kann man auch alle Arten von Icons (direkt aus resource-dlls,
aber auch als ByteArray-Haufen - oder auch "vom *.ico File"
als Cairo-Surface laden - und in der Cairo.Imagelist dann
"global vorhalten".

Der RC4 (obwohl ziemlich groß) kann das was Du möchtest,
also leisten - er ist zwar eigentlich gedacht, die
CommonControls spàter komplett abzulösen (über die bereits
vollends funktionierende WidgetEngine) - er enthàlt
aber auch genügend Funktionen (wie z.B. die Picture-
Property auf den Cairo-ImageSurfaces) für eine
"softe Migration" bzw. Interaktion mit VB6-Code
in bestehenden Anwendungen.

Olaf

Ähnliche fragen