Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249153 (10589)
  Suchen
 Zurück zur Übersicht
 AutorThema: ICONS im Speicher bearbeiten
Uwe Beisler
Datum:23.02.02 01:00 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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