![]() |
Lösung TListview eigene Farbe andere Icons für Aktive Items
Liste der Anhänge anzeigen (Anzahl: 2)
:mrgreen: hallo zusammen
Da ich nirgends eine Listviewkomponente gefunden habe bei der man das Erscheinungsbild der fokusierten Items (wird ja von Windows gesteuert clHighlight bzw grau wenn kein focus) einstellen kann habe ich mal selbst handangelegt. Da ich schon einige fragen zu diesem thema im forum gefunden habe aber wie gesagt keine antwort fand möchte ich euch meine Lösung nicht vorenthalten. Funktionen: (Siehe Anlagen) Andere Icons für markierte Items Die Markierung wird in einer gewünschten Farbe gezeichnet (auch wenn item fokusiert) um die Markierung wird ein Rand in einer anderen Farbe gezeichnet. Der Code müsste für jede TListview bei Viewstyle vsicon und vsreport funktionieren :coder: :coder:
Delphi-Quellcode:
//------------------------------------------------------------------------------
procedure TFmDesigner.lvGruppenCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); var aIconRect, aTextRect:TRect; begin if (Item.Index=TListView(Sender).ItemIndex) or (TListView(Sender).ItemFocused=Item) or (Item.selected) then begin DefaultDraw:=False; aIconRect:=Item.DisplayRect(drBounds); aTextRect:=Item.DisplayRect(drLabel); if TListView(Sender).ViewStyle=vsIcon then begin with Sender do begin Canvas.Pen.Color := $008FC2B3; Canvas.Brush.Color := $00CDEFE9; Canvas.Rectangle(aTextRect); Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_CENTER+DT_WORDBREAK); Canvas.Brush.Color:=$008FC2B3; Canvas.FrameRect(aTextRect); TListView(Sender).LargeImages.Draw(Canvas,aIconRect.Left+((aIconRect.Right-aIconRect.Left) div 2)-TListView(Sender).LargeImages.Width div 2 ,aIconRect.Top+2,1); end; end; if TListView(Sender).ViewStyle<>vsIcon then begin with Sender do begin Canvas.Pen.Color := $00CDEFE9; Canvas.Brush.Color := $00CDEFE9; Canvas.Rectangle(aTextRect); aTextRect.Left:=aTextRect.Left+2; Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_VCENTER); Canvas.Brush.Color:=$008FC2B3; Canvas.FrameRect(aTextRect); TListView(Sender).SmallImages.Draw(Canvas,aIconRect.Left+2 ,aIconRect.Top,1); end; end; end //Aktives Item end; //------------------------------------------------------------------------------ da ich mich bis jetzt sehr wenig mit komponentenentwicklung beschäftigt habe würde es mich freuen wenn mir jemand helfen würde diese funktionen in eine eigene Tlistviewkl Klasse einzubauen. Ich möchte im Objektinspektor folgendes einstellen können (Farbe Markierung, Farbe Rand, Imageindex für Mark Items gross(Aus LargeImages) und klein (SmallImages) |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
:hi:
noch ne kleine verbesserung. Bei viewstyle vsicon gabs ein problem wenn sehr viel text in den captions war (mehr als 20 Zeichen) mit folgender Codeänderung funktioniert auch dass
Delphi-Quellcode:
:coder2:
if TListView(Sender).ViewStyle=vsIcon then
begin with Sender do begin Canvas.Pen.Color := $008FC2B3; Canvas.Brush.Color := $00CDEFE9; Canvas.Rectangle(aTextRect); Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_EDITCONTROL+DT_CENTER+DT_WORDBREAK); //Hier war vorher nur DT_CENTER+DT_WORDBREAK Canvas.Brush.Color:=$008FC2B3; Canvas.FrameRect(aTextRect); TListView(Sender).LargeImages.Draw(Canvas,aIconRect.Left+((aIconRect.Right-aIconRect.Left) div 2)-TListView(Sender).LargeImages.Width div 2 ,aIconRect.Top+2,1); end; end; |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
super code!!
ich habs an einer listview mit ViewStyle = vsReport probiert, und es funktioniert ganz gut. das einzige problem ist, dass nur die erste spalte so abgeändert wird, ich hätte aber lieber wenn die subitems dann auch noch so markiert werden. ich habe schon probiert ob das funktioniert, leider habe ich es aber nicht hinbekommen. könnte jemand den code noch so abändern dass es auch für die subitems funktioniert? gruss urbanbruhin |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
guter vorschlag :wink:
es ist zwar bei listviews normalerweise üblich dass nur die erste spalte markiert wird (siehe windows explorer) aber man kanns ja mal versuchen. Damit der code für die subitems geht müsste man an die koordinaten des rects für die einzelnen subitems kommen. Hat da jemand eine spontane idee :?: :?: :?: |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
hab mal ein bißchen herumprobiert.
Das grössere Problem glaub ich wird es an das canvas der subitems zu kommen wenn man das rechteck wo er zeichnet weiter nach rechts verschiebt beim costumdrawsubitem macht er zwar die markierung und den text allerdings immer in der 1. spalte :gruebel: :gruebel: :gruebel: |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
bin auch schon die längste zeit am rumprobieren, und ich komme immer näher ans ziel :bounce1:
dauert aber noch ein bisschen bis ich fertig bin... |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
Liste der Anhänge anzeigen (Anzahl: 1)
ich habs siehe anlage code folgt :mrgreen:
|
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
ich habs jetzt auch fast, aber mit den farben stimmt noch etwas nicht ganz genau...
naja, ich warte jetzt mal auf deinen code, etom291272. @etom291272 passt jetzt nicht grad zum thema, aber ich habe da grad den schönen button rechts oben auf deinem screenshot gesehen. wie hast du den gemacht? |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
die lösung war in der DP :dp:
ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @aTextRect);
Delphi-Quellcode:
da die routine im oncustomdrawsubitem nur funktionierte wenn ich im oncustomdrawitem das Defaultdraw auf true liess (was natürlich nicht geht) hab ich versucht alles im oncustomdrawitem zu zeichnen und das ging :gruebel: :thumb:
uses CommCtrl
//------------------------------------------------------------------------------ procedure TfmVarZusStln.lvElementeCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); var aIconRect, aTextRect:TRect; SubItem:Integer; begin if (Item.Index=TListView(Sender).ItemIndex) or (TListView(Sender).ItemFocused=Item) or (Item.selected) then begin DefaultDraw:=False; aIconRect:=Item.DisplayRect(drBounds); aTextRect:=Item.DisplayRect(drLabel); if TListView(Sender).ViewStyle=vsIcon then begin with Sender do begin Canvas.Pen.Color := $008FC2B3; Canvas.Brush.Color := $00CDEFE9; Canvas.Rectangle(aTextRect); Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_EDITCONTROL+DT_CENTER+DT_WORDBREAK); Canvas.Brush.Color:=$008FC2B3; Canvas.FrameRect(aTextRect); TListView(Sender).LargeImages.Draw(Canvas,aIconRect.Left+((aIconRect.Right-aIconRect.Left) div 2)-TListView(Sender).LargeImages.Width div 2 ,aIconRect.Top+2,1); end; end; if TListView(Sender).ViewStyle<>vsIcon then begin with Sender do begin Canvas.Pen.Color := $00CDEFE9; Canvas.Brush.Color := $00CDEFE9; Canvas.Rectangle(aTextRect); aTextRect.Left:=aTextRect.Left+2; Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_VCENTER); Canvas.Brush.Color:=$008FC2B3; Canvas.FrameRect(aTextRect); TListView(Sender).SmallImages.Draw(Canvas,aIconRect.Left+2 ,aIconRect.Top,1); //---------------------------------------------------------------------- //SubItems durchlaufen for SubItem:=1 to Item.SubItems.Count do begin ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @aTextRect); if TListView(Sender).ViewStyle=vsReport then begin with Sender do begin Canvas.Pen.Color := $00CDEFE9; Canvas.Brush.Color := $00CDEFE9; Canvas.Rectangle(Rect(aTextRect.Left+2,aTextRect.Top,aTextRect.Right,aTextRect.Bottom)); aTextRect.Left:=aTextRect.Left+2; Windows.DrawText(Canvas.Handle, @Item.SubItems[SubItem-1][1], Length(Item.SubItems[SubItem-1]), aTextRect, DT_VCENTER); Canvas.Brush.Color:=$008FC2B3; Canvas.FrameRect(aTextRect); end; end; end; //---------------------------------------------------------------------- end; end; end; //Aktives Item end; //------------------------------------------------------------------------------ |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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