Para que te hagas una idea de cómo lo hago yo...
Código Delphi
[-]
procedure TLeyendaNode.DrawBody(Canvas: TCanvas);
var
i:Integer;
obj:TGraphNode;
_MinWidth:Integer;
begin
inherited;
if (Self.State = osDestroying) then begin
Exit;
end;
try
if (FAutoSizeHeight) then begin
Self.Height := DEFAULT_HEIGHT_TITLE +
(FTextNodes.Count * DEFAULT_HEIGHT_ELEMENT) +
(DEFAULT_HEIGHT_ELEMENT DIV 2);
Self.Width := Max(Self.Width, DEFAULT_HEIGHT_ELEMENT);
end;
_MinWidth := 0;
for i := 0 to (FTextNodes.Count - 1) do begin
obj := TGraphNode(FColorNodes.Objects[i]);
obj.OwnerNode := Self;
obj.Left := Self.Left + LEFT_SPACE;
obj.Top := Self.Top + DEFAULT_HEIGHT_TITLE + (DEFAULT_HEIGHT_ELEMENT * i);
obj.Width := DEFAULT_HEIGHT_ELEMENT;
obj.Height := DEFAULT_HEIGHT_ELEMENT - 1;
obj.Brush.Color := StrToInt(FColorNodes.Strings[i]);
obj.Pen.Color := clGray;
obj.CanSelect := False;
obj := TGraphNode(FTextNodes.Objects[i]);
obj.Left := Self.Left + LEFT_SPACE + DEFAULT_HEIGHT_ELEMENT + LEFT_SPACE;
obj.Top := Self.Top + DEFAULT_HEIGHT_TITLE + (DEFAULT_HEIGHT_ELEMENT * i);
obj.Width := Self.Width - LEFT_SPACE - DEFAULT_HEIGHT_ELEMENT - LEFT_SPACE -
(SOMBRA_WIDTH * 2);
obj.Height := DEFAULT_HEIGHT_ELEMENT;
obj.Alignment := taLeftJustify ;
obj.Text := FTextNodes.Strings[i];
_MinWidth := Max(_MinWidth, Canvas.TextWidth(obj.Text) + (LEFT_SPACE * 2));
obj.Pen.Style := psClear;
obj.CanSelect := False;
end;
if not Assigned(FTitleNode) then begin
FTitleNode := Owner.InsertNode(nil, TEtiquetaNode);
FTitleNode.OwnerNode := Self;
FTitleNode.Visible := Self.Visible;
FTitleNode.Top := Top;
FTitleNode.Left := Left;
FTitleNode.Height := DEFAULT_HEIGHT_ELEMENT - (SOMBRA_WIDTH * 2);
FTitleNode.Width := Width;
FTitleNode.CanSelect := False;
FTitleNode.BringToFront;
FTitleNode.Selected := False;
FTitleNode.CanSelect := False;
FTitleNode.Font.Style := FTitleNode.Font.Style + [fsBold];
end;
FTitleNode.Top := Top + 1;
FTitleNode.Left := Left + (DEFAULT_HEIGHT_ELEMENT div 2);
FTitleNode.Width := Width - SOMBRA_WIDTH - DEFAULT_HEIGHT_ELEMENT;
FTitleNode.Text := FTitle;
FTitleNode.Font.Color := clBlack;
_MinWidth := Max(_MinWidth, Canvas.TextWidth(FTitleNode.Text) +
(DEFAULT_HEIGHT_ELEMENT * 2));
if (FAutoSizeWidth) then begin
Self.Width := Max(_MinWidth, DEFAULT_HEIGHT_ELEMENT);
end;
finally
end;
end;
Es un objeto que correspomde a un cuadro de leyenda.
Como ves es un objeto al que se le pasan un número de elementos (Texto + Color); Al mover la leyenda se posicionan de nuevo los elementos interiores.