AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Transparente Bitmap im Listvie-Header?

Ein Thema von Mattze · begonnen am 20. Feb 2015 · letzter Beitrag vom 21. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2      
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 10:38
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
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 11:10
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 SmallImages auf diese ImageList gesetzt.
Sieht aus wie im Anhang (16px).
Miniaturansicht angehängter Grafiken
unbenannt.png  

Geändert von Der schöne Günther (20. Feb 2015 um 11:14 Uhr) Grund: Anderes Bild
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 12:03
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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.470 Beiträge
 
Delphi 12 Athens
 
#4

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 12:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 12:55
Es geht mit Sicherheit. Die VCL wird mit Sicherheit auch nur das Image aus der Imagelist holen und die gleiche API intern aufrufen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#6

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 14:47
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 14:54
Zeig mal wie du das Bitmap erstellst/lädst
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#8

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 16:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 17:40
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#10

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 19:41
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 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