【问题标题】:How to change TreeView node height, to draw 3 lines in a node如何更改 TreeView 节点高度,在节点中绘制 3 条线
【发布时间】:2014-01-08 16:55:56
【问题描述】:

我将 D7 与 TreeView(不是 VirtualTreeView)一起使用。如何更改节点高度以使用 OwnerDraw 并在节点矩形中绘制 3(或 5 或更多)“行”文本?

所以树应该是这样的(根节点 + 2 个节点,aaa 和 bbb):

[+] Root node
 |
 |  [aaa1
 |--[aaa2222
 |  [aaa333
 |
 |  [bbb1
 |--[bbb2222
 |  [bbb333
 |
...

我知道如何使用自绘。但不知道如何制作高节点矩形。

【问题讨论】:

  • 这里是a proof,这是可能的,但我建议你不要这样做。您可以投入大量工作来学习更好的控制,例如VirtualTreeView,它有一个内置的OnMeasureItem 事件用于获取节点高度。
  • 感谢 sn-p。我去看看。
  • @TLama,它是否兼容a)通常的项目删除和枚举,以及通常的项目添加(有些项目是普通的,有些是高的)。 b) 带有 Objects 属性,所以我可以用 TObject 添加这样的 3x 项?
  • 等等,现在想想,如果你使用TVM_SETITEM消息,你可以在添加项目后设置它。让我试试……

标签: delphi treeview delphi-7


【解决方案1】:

最简单的方法是在节点已经添加到树视图中时设置节点高度。这将使您免于修改原始 VCL 控制代码。您需要做的是设置TVITEMEX 结构的iIntegral 成员,它表示默认节点高度的倍数。如果您需要以像素为单位设置此高度,则必须通过发送 TVM_SETITEMHEIGHT 消息并将默认节点高度设置为 1 像素来设置默认节点高度,但是树视图的外观会被破坏。

下面是一个将Node参数指定的节点的高度设置为默认节点高度的Integral倍的过程:

procedure SetNodeHeight(Node: TTreeNode; Integral: Integer);
var
  ItemEx: TTVItemEx;
begin
  if not Node.Deleting then
  begin
    ItemEx.mask := TVIF_HANDLE or TVIF_INTEGRAL;
    ItemEx.hItem := Node.ItemId;
    ItemEx.iIntegral := Integral;
    TreeView_SetItem(Node.Handle, ItemEx);
  end;
end;

以及将节点设置为默认节点高度的 3 倍的可能用法:

procedure TForm1.Button1Click(Sender: TObject);
var
  Node: TTreeNode;
begin
  Node := TreeView1.Items.AddChild(nil, 'Node 3 times higher than default');
  SetNodeHeight(Node, 3);
end;

当然,您可以使用这样的代码扩展原始 VCL 树视图类,但我会留给您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多