Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249153 (10589)

| Suchen
| Zurück zur Übersicht

Autor | Thema: ICONS im Speicher bearbeiten
Uwe Beisler
| Datum:23.02.02 01:00 (uwe.beisler@t-online.de) |
Hallo, mangels Alternative muß ich Icons aus einer ImageList auslesen, im Speicher bearbeiten (4x4, 4x16 oder 8x16 Pixel übermalen) und wieder zurückschreiben. Zum Thema Auslesen bin ich fündig geworden aber wie bearbeite ich das Icon im Speicher ? Ich habe zwar ein Handel aber keinen Gerätekontext. Zugegeben die Frage klingt lächerlich, aber ich habe nichts gefunden. Danke im voraus ! Uwe
Uwe ''Pascal'' Niemeier
| Datum:23.02.02 09:18 (Pascalxd@owl-online.de) |
Hallo Uwe! Vielleicht ginge es, die benötigten Icons über eine temporäre 2.Imagelist und die Funktion Imagelist_Merge zu erzeugen? Die benötigten Statusanzeigen müssten dann als eigenständige Icons in der Hauptliste enthalten sein. Das Prinzip sähe dann so aus: 1. BasisIcon und Pseudo-Overlay per Merge zusammenfügen (erzeugt Temp-Liste) 2. Neues Icon per GetIcon aus der Temp-Liste holen und in die Hauptliste einfügen 3. Temp-Liste löschen Nur so als Idee; vielleicht bringt das zeitliche Vorteile gegenüber dem Hantieren mit Bitmaps usw. BTW: Wie bzw. in was für einem Control sollen die Icons denn gezeigt werden? HTH Pascal
Uwe Beisler
| Datum:24.02.02 10:21 (uwe.beisler@t-online.de) |
Hallo Pascal, Danke für den Tip, aber ich fürchte das ist zu aufwendig. Es geht übrigens um einen TreeView und ich denke an zunächst max. 32.768 Knoten. Bei ImageList_Merge hantiert die comctrl.dll mit großen Bitmaps (den ImageListen). Und ich glaube d.h. es wird eine komplett Neue erzeugt. Irgendwie glaube ich, daß sich das auch mit weniger Speicherbedarf und schneller realisieren läßt. Da ich ja einen Teil meiner Funktionalität über Overlay abdecken kann geht es nun "nur" noch darum markierte Knoten direkt und indirekt (Eltern-Elemente sollen anzeigen, daß sie einen markierten Knoten beherbergen) zu markieren. Die Häufigkeit ist also nicht sehr hoch. Selbst das indirekte markieren kommt nur "Markierung * Knotentiefe" mal vor. Ich denke im Prinzip müsste es auch gehen eine Bitmap im Speicher zu bearbeiten (kleine Bitmap-Blöcke über eine Bitmap legen). Im Grunde habe ich ja auch einen Gerätekontext nur möchte ich nicht auf das Gerät malen. Profan kann es und die ImageList_Replace Funktion tut auch nichts anderes. Eine andere Alternative wäre es nach jedem Neuzeichnen des TreeView die o.g. Bitmap-Blöcke eben doch direkt auf das Device sprich den Bildschirm/TreeView-Window/Icon-Rect zu schreiben. Das wäre aber dann bei jedem Scroll notwendig also sicher häufiger als die Lösung oben. Uwe
Uwe Beisler
| Datum: 24.02.02 19:36 (uwe.beisler@t-online.de) |
Hallo, mein Denkfehler war : "Speicher (exklusiv-)oder Gerätekontext". Es gibt aber den Speicher-Gerätekontext mittels CreateCompatibleDC. Mit dem Parameter Null ist er auch gleich Bildschirmkompatibel. So weit (oberer Teil des Listings) läuft es nun. Nur beim Auslesen der Images aus der ImageList mit ImageList_GetImageInfo mache ich wohl noch einen Fehler. '********************************************************************************** declare IMAGEINFO# struct IMAGEINFO=hbmImage&,hbmMask&,Unused&,rcImage& dim IMAGEINFO#,IMAGEINFO IMAGEINFO&=IMAGEINFO# ... DEF BitBlt(9) ! "gdi32","BitBlt" def ImageList_Draw(6) !"COMCTL32","ImageList_Draw" ImageList_Draw(IcoList&,0,%hdc,32,16,257) def CreateCompatibleDC(1) !"GDI32","CreateCompatibleDC" DCa&=CreateCompatibleDC(0) DEF CreateBitmap(5) ! "GDI32","CreateBitmap" a&=CreateBitmap(32,16,1,32,b#) ImageList_AddMasked(IcoList&,a&,0) ImageList_Draw(IcoList&,1,%hdc,64,16,257) def SelectObject(2) !"GDI32","SelectObject" SelectObject(DCa&,a&) ' SRCCOPY = $0CC0020 Bitblt(%HDC,128,16,16,16,DCa&,0,0,$CC0020) '*************************************************** bis hier ok ! test$=ImageList_GetImageInfo(IcoList&,0,IMAGEINFO&) ' Wo ist der Fehler ? windowtitle test$ DCb&=CreateCompatibleDC(0) b&=CreateBitmap(32,16,1,32,IMAGEINFO#.hbmImage&) ImageList_AddMasked(IcoList&,b&,0) ImageList_Draw(IcoList&,2,%hdc,64,48,257) SelectObject(DCb&,b&) Bitblt(%HDC,128,48,16,16,DCb&,0,0,$CC0020) '*************************************************** Ich bin für jeden Tip dankbar ! Uwe

| Zurück zur Übersicht