【问题标题】:Draw line at the drop position of a node in treeview in Delphi在Delphi树视图中节点的放置位置画线
【发布时间】:2014-09-18 11:14:55
【问题描述】:

如上图所示,当有人拖动树节点时,如何在树视图中将放置位置显示为一条线?

【问题讨论】:

    标签: c++ delphi delphi-xe delphi-xe5


    【解决方案1】:

    您可以在 CustomDrawItem 事件中为作为放置目标的节点绘制线条。

    procedure TMyForm.TreeView1CustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
     y:Integer;
    begin
       if Node.DropTarget then
        begin
          y := Node.DisplayRect(true).Bottom;
          Sender.Canvas.MoveTo(0,y-1);
          Sender.Canvas.LineTo(Sender.Width,y-1);
          Sender.Canvas.Font.Size :=  10;
        end;
    end;
    

    如果您还想从 cmets 中隐藏选择,则必须将 DefaultDraw 设置为 false 并自行绘制节点的文本。

    procedure TMyForm.TreeView1CustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    Const
      C_WishedAdditional = 10; // addtional lenght to the Node.DisplayRect - width
    var
      r: TRect;
    begin
      if Node.DropTarget then
      begin
        r := Node.DisplayRect(true);
        Sender.Canvas.MoveTo(r.Left, r.bottom - 2); // start of the line
        Sender.Canvas.Pen.Width := 3; // adjust line width
        Sender.Canvas.Pen.Color := clMaroon; // adjust line color
        Sender.Canvas.LineTo(r.Right + C_WishedAdditional, r.bottom - 2); // end of the line
        Sender.Canvas.Font.Color := clBlack;
        SetBkMode(Sender.Canvas.Handle,TRANSPARENT); // prevent text background from overpainting
        Sender.Canvas.TextOut(r.Left + 2, r.top + 1 , Node.Text);
        DefaultDraw := false;
      end;
    end;
    

    【讨论】:

    • 如何隐藏放置目标节点的高亮?
    • 它的作品谢谢你先生,此外如何改变如图所示的线条大小?
    • @Azzi 我进行了编辑,抱歉没有实现所需的行长。
    • 只需将其绘制在画布上即可,例如使用 Draw 或 StretchDraw,您会在本网站上找到很多示例。
    • 如何改变节点来画线?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多