如何绘制:让TreeView的Node的Text部分文字为红色,部分文字为蓝色? ( 积分: 50 )

  • 主题发起人 主题发起人 netrobo
  • 开始时间 开始时间
N

netrobo

Unregistered / Unconfirmed
GUEST, unregistred user!
如何绘制:让TreeView的Node的Text部分文字为红色,部分文字为蓝色?
效果就是类似outlook/foxmail左边的树,当有未读邮件时,树节点会用特殊颜色标出未读的数量。

该如何绘制?
 
如何绘制:让TreeView的Node的Text部分文字为红色,部分文字为蓝色?
效果就是类似outlook/foxmail左边的树,当有未读邮件时,树节点会用特殊颜色标出未读的数量。

该如何绘制?
 
在Tree的CustomDrawItem中
with TCustomTreeView(Sender).Canvas do
begin
if cdsSelected in State then begin
Font.Color := clBlue;
Brush.Color := clWhite;
end;
end;
Good Luck
 
TO haogui0:
你说的方法我当然会使用,但绘制是针对全部text的,该如何针对部分text呢
 
用tag标志蓝色的节点,符合条件的就用上面的代码变蓝
 
是一个节点中的文字有两种颜色。
 
看来只有高手才能解决了。如:Aimingoo、温柔一刀
GOOD LOCK!
 
bnbchinafbi;
我不是高手,我可以解决。

我的代码,括号内为红色。

procedure TfmMain.adDrawitem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages,
DefaultDraw: Boolean);
var
R: Trect;
s: widestring;
Bs, es: widestring;
index: integer;
begin
with tw.Canvas.Brush, tw.Canvas do
begin
font:=screen.IconFont;
R:=Node.DisplayRect(true);
s:=node.Text;
if cdsSelected in State then
Color := clslitem;
if Stage=cdPostPaint then
begin
index:=pos('(', s);
if index>0 then
begin
bs:=copy(s, 1, index-1);
es:=copy(s, index, length(s)-index+1);
[red]font.Color:=clRed;[/red]
DefaultDraw:=false;
R.Left:=R.Left+textWidth(bs)+2;
FillRect(R);
textout(R.Left, R.Top+(R.Bottom-R.Top-textHeight(es)) div 2, es);
end;
if cdsSelected in State then
begin
color:=clslEnd;
R:=Node.DisplayRect(true);
FrameRect(R);
end;
end;
end;
end;
 
这类问题不是这些高手关注的方向,其实只要多用心看看、写写代码,这类问题其实很easy:

form.create中写(TV为TTreeView):
Randomize;
SetBkMode(TV.Canvas.Handle, TRANSPARENT);

然后:

procedure TFrm_Tree.TVAdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
var
i, w: integer;
NodeRect: TRect;
r, g, b: byte;
ws: widestring;
begin
if Stage <> cdPostPaint then exit;
with Sender.Canvas do
begin
NodeRect := Node.DisplayRect(True);
ws := Node.Text;
w := NodeRect.left + 2 - TextWidth(copy(ws, 1, 1));
for i := 1 to length(ws) do
begin
r := Random(256);
g := Random(256);
b := Random(256);
SetTextColor(Handle, rgb(r, g, b));
w := w + TextWidth(copy(ws, i - 1, 1));
TextOut(w, NodeRect.Top + 1, copy(ws, i, 1));
end;
end;
end;
 
这个好像能变粗,不知道可不可以。
uses CommCtrl;

procedure SetNodeBoldState(Node: TTreeNode; Value: Boolean);
var
TVItem: TTVItem;
begin
if not Assigned(Node) then Exit;
with TVItem do
begin
mask := TVIF_STATE or TVIF_HANDLE;
hItem := Node.ItemId;
stateMask := TVIS_BOLD;
if Value then state := TVIS_BOLD
else
state := 0;
TreeView_SetItem(Node.Handle, TVItem);
end;
end;

// Example: Make the first node bold.

// Beispiel: Erster Eintrag fett machen.

procedure TForm1.Button1Click(Sender: TObject);
begin
SetNodeBoldState(TreeView1.Items[0], True);
end;
 
我每天都在关注这个问题.
这个问题对于我来说是个不小的难题.在我看来能解决这个问题的人也算是高手了.
而对于楼上各位谦虚的态度也是值得我学习的地方.不知楼主是否也有同感?
 
呵呵~~,是啊,的确有同感~
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
762
import
I
后退
顶部