AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Transparente Bitmap im Listvie-Header?

Ein Thema von Mattze · begonnen am 20. Feb 2015 · letzter Beitrag vom 21. Feb 2015
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

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

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 11: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
 
#2

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 13: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
 
#3

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 13: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
 
#4

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 15: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
 
#5

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 16: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
 
#6

AW: Transparente Bitmap im Listvie-Header?

  Alt 20. Feb 2015, 18: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
Mattze

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

AW: Transparente Bitmap im Listvie-Header?

  Alt 21. Feb 2015, 08:20
Hi,

ich habe das nun so gelöst, dass ich dem Header der Listview eine eigene Imagelist mit den entsprechenden Symbolen spendiert habe. (Header_setimagelist...)
Das geht.

Nun habe ich nur noch das Problem, das Sortkennzeichen auch gleich bei der "Erstanzeige" der Listview in der ersten column anzuzeigen.
Bei Create und Createwnd der Listview scheint es die Columns noch nicht zu geben.
In TCustomListview habe ich eine private procedure HeaderWndProc(var Message: TMessage);
gefunden. Die wäre es wahrscheinlich.
Leider lässt sich die aber nicht überschreiben (Prozedur in der Basisklasse nicht gefunden).
Ich weiß nicht, warum. Irgendwas habe ich da wohl nicht kapiert...

Ich suche weiter...

Gruß
Mattze
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz