【问题标题】:How to Clip Text in a TTreeview (Continued)如何在 TTreeview 中剪辑文本(续)
【发布时间】:2011-09-22 18:23:32
【问题描述】:

我已经接受了,或者至少我认为我已经接受了我在previous question 中得到的建议。
总而言之,我将 TMS 中的 THTMLTreeList 替换为 TTreeList 并在其中创建了两列。我将第一列设置为 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 使用了错误的东西,但我很少进行图形类型编程,所以我不知道要更改什么。任何帮助,将不胜感激。

【问题讨论】:

  • 你不应该使用发件人的句柄吗?
  • 我的意思是 Sender.Handle 而不是 Sender.Canvas.Handle。
  • 我不知道。那可能是对的。好的。我尝试过这个。我得到了同样的结果。如果您将 TTreeList 放在表单上并使用上面的代码覆盖其 AdvancedCustomDrawItem 事件,您将明白我的意思。这对我来说有点像黑匣子,所以我会尝试任何方法,但这并没有解决问题。
  • @Jerry: Sender.HandleHWND,但 DrawText() 需要 HDCSender.Canvas.Handle 会更合适。在这种情况下,SendertrXML 是同一个对象。
  • @jrodenhi:你所描述的听起来像TRect 包含滚动树时的错误坐标。

标签: delphi


【解决方案1】:

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

【讨论】:

  • +1 我同意出色的毅力。我知道这些东西不会无限供应,我很抱歉用了这么多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多