如何下划线或突出显示节点标题的一部分
How to underline or highlight a part of node caption
我想在我的 virtualtreeview 中实现搜索功能。我想在节点中突出显示或下划线搜索的词。
我该怎么做?
谢谢
我会为 OnDrawText
事件编写一个处理程序,因为它是唯一的事件(目前),您将在其中传递节点文本,以及即将呈现该文本的矩形为canvas准备这样的渲染。这两个任务都有更多合适的事件(例如 OnBeforeCellPaint
或 OnAfterItemErase
用于文本背景突出显示,以及 OnAfterCellPaint
或 OnAfterItemPaint
用于文本下划线),只有 none其中 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;
视觉输出示例:
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;
以及示例视觉输出:
在实际代码中,我建议预先计算那些突出显示的形状,并在 OnDrawText
事件中只绘制,但优化我会留给你;我认为重点是事件本身。
稍作修改。注意if.
var
BackMode: integer;
begin
inherited;
// if the just rendered node's Text starts with the text written in a TEdit control
// called Edit, then...
if StartsText(Sender.SearchBuffer, Text) and (Node = Sender.FocusedNode) then
begin
TargetCanvas.Pen.Color := clRed;
TargetCanvas.MoveTo(CellRect.Left, CellRect.Bottom - 2);
TargetCanvas.LineTo(
CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, Length(Sender.SearchBuffer))),
CellRect.Bottom - 2
);
end;
end;
我想在我的 virtualtreeview 中实现搜索功能。我想在节点中突出显示或下划线搜索的词。
我该怎么做? 谢谢
我会为 OnDrawText
事件编写一个处理程序,因为它是唯一的事件(目前),您将在其中传递节点文本,以及即将呈现该文本的矩形为canvas准备这样的渲染。这两个任务都有更多合适的事件(例如 OnBeforeCellPaint
或 OnAfterItemErase
用于文本背景突出显示,以及 OnAfterCellPaint
或 OnAfterItemPaint
用于文本下划线),只有 none其中 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;
视觉输出示例:
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;
以及示例视觉输出:
在实际代码中,我建议预先计算那些突出显示的形状,并在 OnDrawText
事件中只绘制,但优化我会留给你;我认为重点是事件本身。
稍作修改。注意if.
var
BackMode: integer;
begin
inherited;
// if the just rendered node's Text starts with the text written in a TEdit control
// called Edit, then...
if StartsText(Sender.SearchBuffer, Text) and (Node = Sender.FocusedNode) then
begin
TargetCanvas.Pen.Color := clRed;
TargetCanvas.MoveTo(CellRect.Left, CellRect.Bottom - 2);
TargetCanvas.LineTo(
CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, Length(Sender.SearchBuffer))),
CellRect.Bottom - 2
);
end;
end;