Я преобразую древовидное представление из стандартного TTreeView для использования TVirtualStringTree. Моя последняя задача - реализовать функцию, в которой мне нужно нарисовать индикатор состояния «прошел / не прошел» поверх известного значка узла. С TTreeView я использовал:
var
R : TRect;
begin
R := Node.DisplayRect( True );
StatusIconList.Draw( TreeView1.Canvas,
R.Left - StatusIconList.Width - 14,
R.Top,
3 {MyOverlayImageIndex} );
Результат - красный крестик над основным значком, как показано ниже:
![enter image description here](https://i.stack.imgur.com/oCkhB.jpg)
С 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;
Это лучшее решение? Есть ли лучший способ получить верхний / левый угол основной иконки без ужасного вызова уровня узла?