gpt4 book ai didi

delphi - 在 TreeView 节点中显示额外的文本,而不仅仅是node.text

转载 作者:行者123 更新时间:2023-12-03 14:54:29 26 4
gpt4 key购买 nike

我在 Delphi 中有一个 TTreeView,节点分为三个级别。

我使用节点数据来存储除节点文本之外的另一个标签。

Type
TNodeData = class
ExtraNodeLabel: WideString;
//... other members
end;

我有一个 OnAdvancedCustomDrawItem 事件,我想在节点文本之前显示此 ExtraNodeLabel我希望实现这一目标:

  • 蓝色文本是额外的标签。
  • 突出显示的项目:前两个单词也是一个额外的标签

enter image description here

到目前为止我得到的是:

enter image description here

问题:

  1. 出于某种原因,如果我使用 DrawText/drawTextW,我无法绘制不同样式的文本(由于 unicode 数据,我需要 drawtextW)
  2. 另一个问题是,虚线焦点矩形之外的任何内容都是不可点击的

需要解决的问题:

  1. 如何使用 DrawText/DrawtextW 绘制不同样式的文本
  2. 如何使整个文本可点击?

代码:

procedure TMainForm.TntTreeView1AdvancedCustomDrawItem(
Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
var
txtrect, fullrect : TRect;
DC: HDC;
fs: integer;
fc: TColor;
ExtralabelRect: TRect;
nData: TNodeData;
begin
nData := nil;

if assigned(Node.Data) then begin
nData := TNodeData(Node.Data);
end;

DC := TntTreeView1.canvas.Handle;
txtRect := Node.DisplayRect(True);
fullrect := Node.DisplayRect(False);

if stage = cdPostPaint then begin
TntTreeView1.Canvas.FillRect(txtRect);
if (cdsFocused In State) And (cdsSelected in State) then begin
DrawFocusRect(DC,txtRect);
end;

txtRect.Left := txtRect.Left + 1;
txtRect.Top := txtRect.Top + 1;
txtRect.Right := txtRect.Right - 1;
txtRect.Bottom := txtRect.Bottom - 1;

ExtralabelRect := txtRect;

fs := TntTreeView1.Canvas.Font.size;
fc := TntTreeView1.Canvas.Font.Color;

if (nData <> nil) And (nData.ExtraNodeLabel <> '') then begin
TntTreeView1.Canvas.Font.Size := 7;
TntTreeView1.Canvas.Font.color := clBlue;
DrawTextW(
DC,
PWideChar(nData.ExtraNodeLabel),
Length(nData.ExtraNodeLabel),
ExtraLabelRect,
DT_LEFT or DT_CALCRECT or DT_VCENTER
);

DrawTextW(
DC,
PWideChar(nData.ExtraNodeLabel),
Length(nData.ExtraNodeLabel),
ExtraLabelRect,
DT_LEFT or DT_VCENTER
);

txtRect.right := txtRect.Right + ExtraLabelRect.Right + 5;
txtRect.Left := ExtraLabelRect.Right + 5;
end;

TntTreeView1.Canvas.Font.Size := fs;
TntTreeView1.Canvas.Font.color := fc;

DrawTextW(
DC,
PWideChar((Node as TTntTreeNode).Text),
-1,
txtRect,
DT_LEFT or DT_VCENTER
);
end;
end;

最佳答案

OP的解决方案

通过定义 TFont 变量并使用 SelectObjectsetTextColor,我成功地部分解决了自定义绘图问题。设置字体颜色和样式有效,但设置字体大小无效。

var 
nFont: TFont;
begin
DC := TntTreeView1.Canvas.Handle;
NFont := TFont.Create;

// rest of the code here ...

// i tried to set nFont.Size, but it doesn't seem to work
nFont.Size := 7;
nFont.Color := colorToRGB(clBlue);
nFont.Style := TntTreeview1.Font.Style + [fsBold];

SelectObject(DC,NFont.Handle);
SetTextColor(DC,colortoRGB(clBlue));

DrawTextW(
DC,
PWideChar(nData.nodeLabel),
Length(nData.nodeLabel),
ExtraLabelRect,
DT_LEFT or DT_VCENTER
);

// rest of the code here
end;

来源: I used the idea from here

<小时/>

更新2

我通过将 TreeView 的 RowSelect 属性设置为 true 解决了第二个问题。为此,为了工作,我必须将 ShowLines 属性设置为 false,并自定义绘制线条和按钮。现在可以了。

<小时/>

更新3

我改进了第一个问题的解决方案,不创建新字体,而是选择 Canvas 字体来显示文本,这样我就能够更改字体的任何方面,并且还应用了系统cleartype设置:

// set font size for the canvas font (font style can be set the same time)
TntTreeView1.Canvas.Font.Size := 7;

// select canvas font for DC
SelectObject(DC,TntTreeView1.Canvas.Font.Handle);

// set font color
SetTextColor(DC,colortoRGB(clBlue));

关于delphi - 在 TreeView 节点中显示额外的文本,而不仅仅是node.text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17488685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com