Mahlzeit.
Also, wenn ich dort z.B. einfach nur Folgendes reinschreibe und den Text via DefaultDraw zeichnen lasse, dann wird der Text rot.
Sender.Canvas.Font.Color := clRed;
Aber da ich nur einen bestimmten Teil der Zeile umfärben möchte, muß ich selber zeichnen,
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:
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 + ')');
Hab auch schon alle möglichen Farbangaben probiert
Delphi-Quellcode:
Sender.Canvas.Font.Color := clRed;
Sender.Canvas.Pen.Color := clRed;
Sender.Canvas.Brush.Color := clRed;
Und bei keiner ändert sich die Farbe.
Das Selbe gilt auch für Sender.Canvas.Font.Style .
Hier mal meine Methode:
Delphi-Quellcode:
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;
und alle von Default abweichende Einstellungen:
Code:
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
(in OnChange und OnDblClick passiert auch nix Entscheidendes)
Demo im Anhang (restliche Quellcodes in
MyInsight zu finden):
betreffendes TreeView liegt hinter der Taste F6, bzw "call insight"
bei den "Edit"s liegt ein
"unsichtbares" Bitmap/Icon davor, deshalb ist auch da der Effekt zu sehn
- 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).