Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Transparente Bitmap im Listvie-Header? (https://www.delphipraxis.net/184025-transparente-bitmap-im-listvie-header.html)

Mattze 20. Feb 2015 09:38

Transparente Bitmap im Listvie-Header?
 
Hi,

Bitmaps kriege ich ja inzwischen problemlos in den Header einer Listview gezeichnet. (Den Sortierpfeil.)

Ich kriege diese Bitmap im Header aber nicht transparent. Habe alles mögliche probiert.
Per Google habe ich da bisher auch keine Lösung gefunden.
Evtl. geht das ja nicht, was ziemlich unangenehm wäre...

Weiß jemand, wie man eine Bitmap im oder in den Listview-Header transparent reinbekommt?

Gruß
Mattze

Der schöne Günther 20. Feb 2015 10:10

AW: Transparente Bitmap im Listvie-Header?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ist doch immer linke obere Ecke ist die Farbe die dann "durchsichtig" ist, oder? Ich habe nur einfach mal eine ImageList mit so einem kleinen Bild bestückt und im ListView
Delphi-Quellcode:
SmallImages
auf diese ImageList gesetzt.
Sieht aus wie im Anhang (16px).

Mattze 20. Feb 2015 11:03

AW: Transparente Bitmap im Listvie-Header?
 
Hi,

1. Soweit ich mich erinnere, geht das per Imagelist tatsächlich. Ich schrieb aber nichts von einer Imagelist, sondern einer Bitmap, die ich in den Header einfüge. Das geht auch und zwar direkt (per API). Für diese Bitmap kriege ich die Transparenz im Listview-Header nicht hin. Eine Imagelist ist hier nicht möglich, da es sich um eine Komponente handelt und die Zuweisung der Imagelist natürlich auch noch extern möglich sein sollte. (Das Umkopieren der Imagelist wäre zwar wahrscheinlich möglich, aber nicht so schön!)
2. Die gleiche Bitmap transparent auf den Canvas der Form gemalt - zum Test - funktioniert.
3. Falls Transparentcolormode der Bitmap auf tmFixed gesetzt ist, ist Transparentcolor immer die Farbe des Pixels in der "unteren linken Ecke".

Also, nochmal, wie kriegt man die Transparenz einer Bitmap im Listview-Header hin, die NICHT per Imagelist eingebaut wurde, sonder direkt per Header_SetItem(...) (aus der API)?

Gruß
Mattze

Blup 20. Feb 2015 11:52

AW: Transparente Bitmap im Listvie-Header?
 
Geht scheinbar nicht direkt.
a) Komplett selber zeichnen (Owner Draw).
b) Der Komponente eine zusätzliche versteckte Imageliste spendieren, in der die Bitmaps abgelegt werden.
c) Den Hintergrund vorher über die transparenten Teile der Bitmap mahlen (oder eine Kopie) und dann erst zuweisen.

Neutral General 20. Feb 2015 11:55

AW: Transparente Bitmap im Listvie-Header?
 
Es geht mit Sicherheit. Die VCL wird mit Sicherheit auch nur das Image aus der Imagelist holen und die gleiche API intern aufrufen.

Mattze 20. Feb 2015 13:47

AW: Transparente Bitmap im Listvie-Header?
 
Hi,

@Neutral General: Ich glaube ja auch, dass es geht, aber wie? Per Google ist dazu nichts zu finden.

@Blup:
ad a)
Komplett selber zeichnen geht leider nicht, da sich die Hintergrundfarbe des Listview-Headers ändert, wenn man mit der Mouse da drauf ist. Und dann der Farbverlauf...
Da wäre der Aufwand einfach zuuu groß.
ad b)
Das geht leider auch nicht. Da die Listview und der Header die gleiche Imagelist verwenden, würde man bei einer "Runtimeänderung" nicht mehr zurecht kommen. (Ich meine, wenn ich zur Laufzeit noch Bilder in die Imagelist aufnehme oder ändere.)
Halt! Mal was probieren... Vielleicht funktioniert es, wenn man zur Laufzeit die entsprechenden Bilder in die externe Imagelist von der Komponente aus reinbringt oder, falls keine externe vorhanden ist, eine interne ("versteckte") benutzt. Mal sehen...
Ist aber sicher auch einiges an Aufwand...
ad c)
Siehe ad a). Sobald es da Farbänderungen gibt, wird es unübersichtlich.

Trotzdem: Eine direkte Methode wäre mir natürlich lieber und, wie Neutral General schreibt, ist es durchaus wahrscheinlich, dass es da was gibt. Mit der Imagelist kann es doch die Listview.

Gruß
Mattze

Neutral General 20. Feb 2015 13:54

AW: Transparente Bitmap im Listvie-Header?
 
Zeig mal wie du das Bitmap erstellst/lädst

Mattze 20. Feb 2015 15:05

AW: Transparente Bitmap im Listvie-Header?
 
Hi,

so wird's geladen:
Delphi-Quellcode:
var
  hdr: HWND;
  hdritem: THDItem;
begin
  hdr := Listview_GetHeader(handle);
  FillChar(hdritem, sizeof(hdritem), 0);
  hdritem.Mask := HDI_FORMAT;
  Header_GetItem(hdr, column.index, hdritem);
  hdritem.Mask := HDI_FORMAT or HDI_BITMAP;
  if FSortDirection=sdAscending then
    hdritem.hbm := FDownArrow.Handle
  else
    hdritem.hbm := FUpArrow.Handle;
  if fsortarrowwhere=saLeft then
    hdritem.fmt := hdritem.fmt or HDF_BITMAP //$400 or $200
  else
    hdritem.fmt := hdritem.fmt or HDF_BITMAP_ON_RIGHT or HDF_BITMAP;
  Header_SetItem(hdr, column.index, hdritem);
  end;
end;
Und das funktioniert auch gut.

Inzwischen bin ich einen Schritt weiter und weiß nicht weiter...
Bei der Benutzung einer Listview.smallimagelist
ist mir folgendes aufgefallen:
1. Lade ich mein Bild mit dem Editor der Imagelist, wird es danach transparent im Header dargestellt.
2. Lade ich es mit Imagelist.addbitmap(Bild,nil);, weil ich ja keine Maske habe, wird es danach im Header nicht mehr transparent dargestellt.

Es scheint also an der "automatisch generierten" Maske zu liegen, wenn man das Bild per Editor lädt.
Und nun weiß ich nicht, wie ich die kriege (Imagelist.getMaskbitmap kriege ich nicht hin) und wie ich das direkt maskiert in den Header machen kann.

Wisst Ihr weiter?

Gruß
Mattze

Neutral General 20. Feb 2015 16:40

AW: Transparente Bitmap im Listvie-Header?
 
Versuch mal Add, statt AddBitmap.
Wenn das nicht klappt binde mal die Unit "XPMan" in deine Haupt-Unit oder besser in die .dpr ein und schau mal ob das klappt.
(Evtl. auch mit deiner ursprünglichen Methode)

Mattze 20. Feb 2015 18:41

AW: Transparente Bitmap im Listvie-Header?
 
Hallo,

dank dem Hinweis mit einer anderen Imagelist.add... scheine ich mein erstes Problem gelöst zu haben.
Imagelist.add ist es nicht. Das will eine Bitmap und eine Maske als Parameter.
Was Du meintest, ist wahrscheinlich das Imagelikst.addmasked.
Da übergibt man eine Bitmap und eine Transparenzfarbe.
Damit scheint es über die Imagelist tatsächlich zu funktionieren.
Ich würde es aber doch gerne nach meiner direkten Variante machen - das ist wohl die eigentlich korrekte API-Form.
Nur weiß ich nicht, wie ich da die Bitmap mit dieser Maske zusammenkriege.
Vielleicht muss ich erst eine neue Bittmap mit maskblt (Wie wird die Maske - ist eine Bitmap - aus der Farbe erzeugt?) basteln.
Nun, schaun mer mal...

Gruß
Mattze


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz