如何在TTreeview中剪辑文本(续)

时间:2011-09-22 18:23:32

标签: delphi

我接受了这个建议,或者至少我认为我已经接受了previous question 总而言之,我用TreeList替换了TMS中的THTMLTreeList,并在其中创建了两列。我将第一列设置为150像素,并使用以下代码覆盖AdvancedCustomDrawItem事件:

procedure TForm1.trXMLAdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
var hContext: HDC;
    s: PChar;
    iLength: Integer;
    uRect: TRect;
begin
  DefaultDraw := False;
  hContext := trXML.Canvas.Handle;
  s := PChar(Node.Text);
  iLength := Length(Node.Text);
  uRect := Node.DisplayRect(True);
  DrawText(hContext, s, iLength, uRect, DT_END_ELLIPSIS);
end;

我得到了我期望的结果,也就是说,当我绘制树时,第一列中的文本被剪裁。当我更改第一列的大小时,文本被适当地剪裁。但是当TreeList不够宽并且底部有一个滚动条并向右滚动时,文本现在延伸到第二列的数量与移动滚动条的数量相同。就像文本是相对于TreeList的客户区而不是部分隐藏的第一列绘制的,因此它总是将150个像素扩展到TreeList中。

在我看来,我对设备上下文句柄或TRect使用了错误的东西,但是我做了很少的图形类型编程,所以我不知道要改变什么。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

我刚检查了TMS的源代码和 TTreeList已使用DT_END_ELLIPSIS标记 并在DefaultDraw参数设置为True时对绘制文本进行每列剪裁,因此您无需手动绘制文本。