如何为下划线或突出显示节点标题的一部分

r03*_*mp5 3 delphi virtualtreeview

我想在virtualtreeview中实现一个搜索功能.我想突出显示或强调节点中搜索到的单词.

我怎样才能做到这一点?谢谢

TLa*_*ama 6

我会为OnDrawText事件编写一个处理程序,因为它是唯一的事件(此时),您将传递节点文本,即将要呈现该文本的矩形以及为此类呈现准备的画布.两个任务都有更多适当的事件(例如OnBeforeCellPaint,或OnAfterItemErase用于文本背景突出显示,OnAfterCellPaintOnAfterItemPaint用于文本下划线),它们都不提供文本呈现特定参数作为OnDrawText一个.

如果您的节点不是多行的,并且您不关心文本对齐,阅读方向和字符串缩短,那么您的任务可能就像以下示例之一一样简单.

1.匹配文本背景颜色

procedure TForm1.VirtualTreeDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
  Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
  var DefaultDraw: Boolean);
var
  BackMode: Integer;
begin
  // if the just rendered node's Text starts with the text written in a TEdit control
  // called Edit, then...
  if StartsText(Edit.Text, Text) then
  begin
    // store the current background mode; we need to use Windows API here because the
    // VT internally uses it (so the TCanvas object gets out of sync with the DC)
    BackMode := GetBkMode(TargetCanvas.Handle);
    // setup the color and draw the rectangle in a width of the matching text
    TargetCanvas.Brush.Color := clYellow;
    TargetCanvas.FillRect(Rect(
      CellRect.Left,
      CellRect.Top + 1,
      CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, Length(Edit.Text))),
      CellRect.Bottom - 1)
    );
    // restore the original background mode (as it likely was modified by setting the
    // brush color)
    SetBkMode(TargetCanvas.Handle, BackMode);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

示例视觉输出:

在此输入图像描述

2.匹配文字下划线

procedure TForm1.VirtualTreeDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
  Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
  var DefaultDraw: Boolean);
begin
  // if the just rendered node's Text starts with the text written in a TEdit control
  // called Edit, then...
  if StartsText(Edit.Text, Text) then
  begin
    TargetCanvas.Pen.Color := clRed;
    TargetCanvas.MoveTo(CellRect.Left, CellRect.Bottom - 2);
    TargetCanvas.LineTo(
      CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, Length(Edit.Text))),
      CellRect.Bottom - 2
    );
  end;
end;
Run Code Online (Sandbox Code Playgroud)

并举例说明视觉输出:

在此输入图像描述

在实际代码中,我建议预先计算那些高光形状,并且在OnDrawText事件中只绘制,但优化我会留给你; 我认为,重点是事件本身.

  • 谢谢TLama.我也会在几周内尝试这些代码. (2认同)