MS Imagelist (Design) Bug

NRFi

Erfahrenes Mitglied
Moin auch,

Vorgeschichte: Windows lässt standardmässig nur 10000 GDI-Handles (pro Instanz?) zu. Wenn man zb eine Form erstellt und sich darauf ein Image-control packt und mit einem Image füllt, dann werden 4 GDI-Handles verbraucht. Also 1 Bild = 4 Handles. Wird jetzt eine Imagelist auf die Form gepackt, und man packt in diese 2501 Icons, dann wird die Anwendung theoretisch abschmieren. wenn du in einer Anwendung zwei Forms hast und von einer Form die zweite immer aufrufst, die auch viele Images hat, dann werden die Images darauf immer hinzuaddiert. d.h. hast du form1 und form2 und form2 hat 100 icons, kannst du theoretisch auf einmal form2 nur 25 mal offen haben.
So, ich habe ein Control, dass eine Imagelist enthält, die 120 Icons enthält. Dieses Control sitzt auf einem weiteren Control und kann darauf bis zu viermal instanziiert werden, also pro Hauptcontrol 480 Icons x 4 = 1920 GDI-Handles. D.h. ich öffne das Control nicht mal oft und schon schmiert mir die Anwendung weg.

Also ist die Imagelist schon mal keine Lösung für viele Images. Dann hab ich es halt mit der Resource-Datei in VB versucht. Problem, man kann nur Bitmaps - also bmps laden. Ich habe aber Icons und zwar deswegen, da die einen transparenten Hintergrund haben müssen. Wenn ich diese Icons unter Custom ablege, kann ich diese als Byte-Array zurückliefern. Hier mein Problem:


Code:
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long 'damit kann ich aus bytearrays pitcures machen

Public sub loadblablub
     dim bRet() as byte
     
     bRet = LoadResData(...) 'hier kriege ich das array zurück - funktioniert
     SetBitmapBits Picture1.Image, ubound(bRet), bRet(0) 'bytearray zu Image
     Picture1.Refresh
end sub


so, wenn ich diesen Code da ausführe, dann wird etwas in der PicureBox sichtbar, aber das sieht ganz komisch aus, man kann da gar nichts drauf erkennen.

hat jemand eine ahnung, was ich falsche mache?


Also, Byte-Array(Icon - *.ico) aus LoadResData zu PictureBox = wie?


Danke für die Hilfe. Gruß, NRF :rolleyes:
 
Man kann sehr wohl Icons in Ressourcen speichern: einfach Ressourcen-Manager-->"Symbol hinzufügen"!
 
richtig. sorry, habe ich vergessen zu erwähnen, das kann ich nicht benutzen, da wenn man icons holt die nur 32x32 rausgegeben werden und das darf nicht, müssen 16x16 sein
 
Mal nur so nebenbei gefragt: Was für ein Programm schreibst du, dass du soooo viele Bilder brauchst? :D

mfg
 
Ich würde dir ja empfehlen, die ganzen Icons einfach in einer Zip-Datei mitzugeben, dann kann man Icons auch schnell ändern, bearbeiten usw... Die Zip-Datei kannst du dann bei Bedarf als Ressource einfügen und mit einer kleinen zusätzlichen DLL lässt sich die Zip-Datei dann entpacken (bei Bedarf kann ich mal nach Beispiel-Code dafür suchen, hab das irgendwo).
Ansonsten die Icons als Custom-Type in der Ressource speichern, dann ins Temp-Verzeichnis auf Festplatte schreiben und anschließend mit LoadPicture laden. Dauert warscheinlich etwas länger als direkt mit SetBitmapBits das Bild zu laden, funktioniert aber warscheinlich fehlerfrei.

Ach ja, die Antwort auf meilons Frage würde mich auch interessieren!
 
Zurück