Я конвертирую древовидное представление из стандартного TTreeView для использования TVirtualStringTree. Моя последняя задача - реализовать функцию, в которой мне нужно нарисовать индикатор состояния «прошел / не прошел» поверх значка известного узла. С TTreeView я использовал:
var
R : TRect;
begin
R := Node.DisplayRect( True );
StatusIconList.Draw( TreeView1.Canvas,
R.Left - StatusIconList.Width - 14,
R.Top,
3 {MyOverlayImageIndex} );
Результатом является красный крестик над основным значком, как показано ниже:
С TVirtualStringTree я надеялся найти либо лучший способ, либо получить более известные позиции для требуемого положения значка наложения. Я делаю:
procedure DrawFailed;
var
R : TRect;
begin
R := CellRect;
StatusIconList.Draw( TargetCanvas,
R.Left - StatusIconList.Width + 49 + Sender.GetNodeLevel( Node ) * 16,
R.Top,
siiFailed );
end;
Это лучшее решение? Есть ли лучший способ получить верхний / левый угол основного значка без ужасного вызова уровня узла?