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 |
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:
auf diese ImageList gesetzt.
SmallImages
Sieht aus wie im Anhang (16px). |
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 |
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. |
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.
|
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 |
AW: Transparente Bitmap im Listvie-Header?
Zeig mal wie du das Bitmap erstellst/lädst
|
AW: Transparente Bitmap im Listvie-Header?
Hi,
so wird's geladen:
Delphi-Quellcode:
Und das funktioniert auch gut.
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; 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 |
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) |
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. |
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