Hallo,
Zitat:
Was ich möchte, ist, [...]
Ok, dann habe ich da wohl etwas missverstanden.
Zitat:
daß vom root Knoten beginnend (mit alle seinen Unterknoten und Einträgen), also bis zum nächsten root Knoten alle Einträge eingefärbt werden, beispielsweise ein helles rot oder so, damit das Auge einen Halt hat und auch die Zusammenhänge in dem gewählten Root Knoten besser sieht.
Mit anderen Worten: Ab dem Wurzelknoten sollen alle expandierten Kindknoten farblich hinterlegt werden. Das heißt doch nur: Ab dem Wurzelknoten den Bereich (TRect) bestimmen, der auch den letzten Kindknoten abdeckt und dann den Bereich mit der entsprechenden Farbe füllen.
Vielleicht hilft Dir folgender Code weiter:
Delphi-Quellcode:
type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
procedure TreeView1AdvancedCustomDraw(Sender: TCustomTreeView; const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
procedure TreeView1Expanded(Sender: TObject; Node: TTreeNode);
private
{ Private-Deklarationen }
FCurrentRoot : TTreeNode;
procedure InvalidateTreeview;
public
{ Public-Deklarationen }
end;
procedure GetRectBottom (Node : TTreeNode; var Rect : TRect);
begin
while Assigned (Node) do
begin
Rect.Bottom := Node.DisplayRect (False).Bottom;
if Node.Expanded then
GetRectBottom (Node.getFirstChild, Rect);
Node := Node.getNextSibling
end
end;
function GetRootNode (const Node : TTreeNode) : TTreeNode;
begin
Result := nil;
if Assigned (Node) then
if not Assigned (Node.Parent) then
Result := Node
else
Result := GetRootNode (Node.Parent)
end;
procedure TForm1.TreeView1AdvancedCustomDraw(Sender: TCustomTreeView; const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
r : TRect;
begin
if Assigned (FCurrentRoot) and (Stage = cdPrePaint) then
begin
r := FCurrentRoot.DisplayRect (False);
r.Bottom := 0;
GetRectBottom (FCurrentRoot.getFirstChild, r);
if r.Bottom > 0 then
begin
TreeView1.Canvas.Brush.Color := clInfoBk;
TreeView1.Canvas.FillRect (r)
end
end
end;
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
begin
if Stage = cdPrePaint then
if not Assigned (FCurrentRoot) or (FCurrentRoot <> GetRootNode (Node)) then
TreeView1.Canvas.Brush.Color := TreeView1.Color
else
TreeView1.Canvas.Brush.Color := clInfoBk
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
InvalidateTreeview;
if Assigned (Node.Parent) then
FCurrentRoot := GetRootNode (Node)
else
FCurrentRoot := Node
end;
procedure TForm1.TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
var
n : TTreeNode;
begin
n := FCurrentRoot;
InvalidateTreeview;
FCurrentRoot := n
end;
procedure TForm1.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
var
n : TTreeNode;
begin
n := FCurrentRoot;
InvalidateTreeview;
FCurrentRoot := n
end;
procedure TForm1.InvalidateTreeview;
begin
FCurrentRoot := nil;
TreeView1.Invalidate
end;
Gruß