TVirtualStringTree 搜索结果高亮
TVirtualStringTree highlight of searching result
我想根据搜索条件突出显示来自 VirtualStringTree 节点的文本,例如来自以下示例:
有什么建议吗?
感谢 TLama 的回答 () 我稍微调整了代码以突出显示中间的文本。
procedure Tform_main.vt_mainDrawText(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const Text: string; const CellRect: TRect; var DefaultDraw: Boolean);
var
BackMode, position: Integer;
begin
// if the just rendered node's Text contain the text written in a TEdit control
// called Edit, then...
position:= Pos(AnsiLowerCase(edit_search.Text), AnsiLowerCase(text));
if position > 0 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 + TargetCanvas.TextWidth(Copy(Text, 1, position-1)),
CellRect.Top + 3,
CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, position-1)) + TargetCanvas.TextWidth(Copy(Text, position, Length(edit_search.Text))),
CellRect.Bottom - 3)
);
// restore the original background mode (as it likely was modified by setting the
// brush color)
SetBkMode(TargetCanvas.Handle, BackMode);
end;
end;
向 TLama 致以最良好的祝愿!
我想根据搜索条件突出显示来自 VirtualStringTree 节点的文本,例如来自以下示例:
有什么建议吗?
感谢 TLama 的回答 (
procedure Tform_main.vt_mainDrawText(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const Text: string; const CellRect: TRect; var DefaultDraw: Boolean);
var
BackMode, position: Integer;
begin
// if the just rendered node's Text contain the text written in a TEdit control
// called Edit, then...
position:= Pos(AnsiLowerCase(edit_search.Text), AnsiLowerCase(text));
if position > 0 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 + TargetCanvas.TextWidth(Copy(Text, 1, position-1)),
CellRect.Top + 3,
CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, position-1)) + TargetCanvas.TextWidth(Copy(Text, position, Length(edit_search.Text))),
CellRect.Bottom - 3)
);
// restore the original background mode (as it likely was modified by setting the
// brush color)
SetBkMode(TargetCanvas.Handle, BackMode);
end;
end;
向 TLama 致以最良好的祝愿!