I would like to highlight the text from a node of VirtualStringTree according to search criteria like example from bellow:
Any suggestion please?
I would like to highlight the text from a node of VirtualStringTree according to search criteria like example from bellow:
Any suggestion please?
Thanks to TLama answer (How to underline or highlight a part of node caption) I adjust a bit the code in order to highlight the text also in the middle.
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;
Best wishes to TLama!
© 2022 - 2024 — McMap. All rights reserved.
DrawText
WinAPI function for text rendering (and fires theOnDrawText
event if assigned). That's the place where I would render the text background (e.g. making a sort ofOnBeforeDrawText
event might be useful). I'm saying so, because in earlier stages, the VT does not know anything about the text and you would be repeating what is done after the events likeOnBeforeCellPaint
fires and before the text is actually rendered. And the task itsef is not easy for wrapped text. And it's not actually related to VT, but as a generic GDI task. – Seine