![]() |
TreeView AdvancedCustomDrawItem - Text färben geht nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Mahlzeit.
Also, wenn ich dort z.B. einfach nur Folgendes reinschreibe und den Text via DefaultDraw zeichnen lasse, dann wird der Text rot.
Delphi-Quellcode:
Aber da ich nur einen bestimmten Teil der Zeile umfärben möchte, muß ich selber zeichnen,
Sender.Canvas.Font.Color := clRed;
allerdings ignoriert Sender.Canvas.DrawText sämtliche Farbangaben und zeichnet immer nur mit der Systemvorgabe, wenn zusätzlich irgendwo noch ein Bitmap via Draw gezeichnet wird. (also es bleibt bei der Systemvorgabe von clWindowsText wenn alleinestehend und clWindow, wenn Selektiert (blau hinterlegt). Wenn man kein Bild gezeichnet wird, dann wird immer nur die erste Farbangabe verwendet. Hier sollte es ja zweifarbig werden, wird es aber einfach nicht:
Delphi-Quellcode:
Hab auch schon alle möglichen Farbangaben probiert
Font.Color := clWindowText;
TextOut(R.Left, R.Top, A.Text); Inc(R.Left, TextWidth(A.Text)); Font.Color := clGrayText; TextOut(R.Left, R.Top, ' (' + A.Source + ')');
Delphi-Quellcode:
Und bei keiner ändert sich die Farbe.
Sender.Canvas.Font.Color := clRed;
Sender.Canvas.Pen.Color := clRed; Sender.Canvas.Brush.Color := clRed; Das Selbe gilt auch für Sender.Canvas.Font.Style . Hier mal meine Methode:
Delphi-Quellcode:
und alle von Default abweichende Einstellungen:
Procedure TInsightForm.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; Stage: TCustomDrawStage; Var PaintImages, DefaultDraw: Boolean); Var A: IInsightAction; R: TRect; Begin If (Stage in [cdPrePaint, cdPostPaint]) and Assigned(Node) Then If Assigned(Node.Data) Then Begin A := IInsightAction(Node.Data); With Sender.Canvas do Begin R := Node.DisplayRect(False); FillRect(R); R := Node.DisplayRect(True); If Assigned(A.Image) Then Draw(R.Left - 16-1, R.Top, A.Image); Inc(R.Left, 1); Inc(R.Top, 1); //Font.Assign(TTreeView(Sender).Font); If cdsHot in State Then Font.Style := Font.Style + [fsUnderline]; If cdsSelected in State Then Font.Color := clWindow Else If cdsHot in State Then Font.Color := clHotLight Else Font.Color := clRed;//clWindowText; TextOut(R.Left, R.Top, A.Text); Inc(R.Left, TextWidth(A.Text)); If A.Source <> '' Then Begin Font.Color := clGrayText; TextOut(R.Left, R.Top, ' (' + A.Source + ')'); Inc(R.Left, TextWidth(A.Source)); End; If A.Hint <> '' Then Begin If cdsSelected in State Then Font.Color := clWindow Else If cdsHot in State Then Font.Color := clHotLight Else Font.Color := clWindowText; TextOut(R.Left, R.Top, ' - ' + A.Hint); End; End; DefaultDraw := False; End Else Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold]; End;
Code:
(in OnChange und OnDblClick passiert auch nix Entscheidendes)
object TreeView1: TTreeView
Left = 4 Top = 40 Width = 312 Height = 237 Anchors = [akLeft, akTop, akRight, akBottom] AutoExpand = True BorderStyle = bsNone HideSelection = False HotTrack = True Images = ImageList1 Indent = 19 ParentColor = True RightClickSelect = True RowSelect = True ShowButtons = False ShowLines = False ShowRoot = False TabOrder = 1 OnAdvancedCustomDrawItem = TreeView1AdvancedCustomDrawItem OnChange = TreeView1Change OnDblClick = TreeView1DblClick end Demo im Anhang (restliche Quellcodes in ![]() betreffendes TreeView liegt hinter der Taste F6, bzw "call insight" bei den "Edit"s liegt ein ![]() - Style und Farbe wird ignoriert bei den Actions gibt es es kein Bild, dort sieht man den anderen Effekt - nur erste Farbe wird übernommen (eigentlich sollte der Text in den Klammern grau werden) und die fetten Überschriffen laufen erfolgreich über DefaultDraw Also ich weiß einfach nicht mehr weiter und hab schon alle möglichen Threads durchgekramt und auch Vieles ausprobiert. [add] Hab es jetzt so weit eingrenzen können, daß sobald RequiredState aufgerufen wird (also beim ersten aufruf einer Zeichenoperation, bzw. schon beim Auslesen des Canvas.Handle), daß sich ab da nix mehr ändern läßt. Alles was vorher festgelegt wurde (Canvas.Font.Color ändert nix, sondern speichert nur in FColor). |
Re: TreeView AdvancedCustomDrawItem - Text färben geht nicht
Toll, ich fürchte ich bin mal wieder auf einen Fehler in der VCL gestoßen. :wall:
Die Fonts und andere Dinge werden nicht entsprechend recreatet (in D2006, D2009 und D2010 ... D7 konnte ich jetzt noch nicht testen) wenn ich statt
Delphi-Quellcode:
direkt
Sender.Canvas.Font.Color := clGrayText;
Delphi-Quellcode:
verwende, dann geht das Umfärben.
SetTextColor(Sender.Canvas.Handle, ColorToRGB(clGrayText));
[edit] Jetzt hatte ich schon vieles auf die WinAPI umgestellt und dann bin ich zufällig auf eine "bessere" Lösung gestoßen. Ich rufe jetzt einfach ein
Delphi-Quellcode:
auf, bevor ich Farbe oder Style ändere.
Sender.Canvas.Refresh;
Somit werden die Pen-, Brush-, und Color-Handles via Canvas.DeselectHandles freigegeben und vor dem Zeichnen wieder mit den aktuellen Daten über Canvas.RequiredState neu erstellt. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 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 by Thomas Breitkreuz