Skip to main content

DevExpress v24.2 Update — Your Feedback Matters

Our What's New in v24.2 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

How to Custom Paint Indent Cells

  • 2 minutes to read

The following example demonstrates how to handle the tree list’s OnCustomDrawIndentCell event used to manually paint indent cells.

In the example, the event handler checks whether a node contains an expand button, and if the expand button exists, paints it (the InternalDrawExpandButton and InternalDrawExpandButtonSign procedures are used for this purpose).

Delphi
//...
uses
//...
  cxGeometry;
procedure <Form>.<TreeList>CustomDrawIndentCell(Sender: TcxCustomTreeList; ACanvas: TcxCanvas; AViewInfo: TcxTreeListIndentCellViewInfo; var ADone: Boolean);
  procedure InternalDrawExpandButtonSign(ACanvas: TcxCanvas; const R: TRect; AExpanded: Boolean; AColor: TColor);
  var
  ASize, X, Y: Integer;
  begin
    with R do
    begin
      ASize := Right - Left - 2 * 2;
      X := (Left + Right) div 2;
      Y := (Top + Bottom) div 2;
    end;
    ACanvas.Brush.Color := AColor;
    ACanvas.FillRect(Rect(X - ASize div 2, Y, X + ASize div 2 + 1, Y + 1));
    if not AExpanded then
      ACanvas.FillRect(Rect(X, Y - ASize div 2, X + 1, Y + ASize div 2 + 1));
  end;
  procedure InternalDrawExpandButton (ACanvas: TcxCanvas; R: TRect; AExpanded: Boolean; AColor: TColor = clDefault);
  begin
    with ACanvas, R do
    begin
    Brush.Color := AColor;
    FillRect(cxRect(Left - 1, Top - 1, Right + 1, Bottom + 1));
    Brush.Color := clBtnFace;
    FillRect(cxRect(Left, Top, Right, Bottom));
    InternalDrawExpandButtonSign(ACanvas, R, AExpanded, clBtnText);
    end;
  end;
begin
  // assign the default font and color settings
  cxApplyViewParams(ACanvas, AViewInfo.ViewParams);
  // specify the indent cell color
  ACanvas.Brush.Color := $FAE6E6 - $000100;
  // paint indent cells
  ACanvas.FillRect(AViewInfo.VisibleRect);
  if (AViewInfo.Button) then
    begin
      // if the current indent cell painted belongs to a group node, then paint the expand button
      InternalDrawExpandButton(ACanvas, AViewInfo.GlyphRect, AViewInfo.Node.Expanded);
    end;
  // suppress the default painting
  ADone := True;
end;