Delphi cxGrid加行号

procedure SetRowNumber(var ASender: TcxGridTableView; AViewInfo: TcxCustomGridIndicatorItemViewInfo; 
  var ACanvas: TcxCanvas; var ADone: boolean); 

uses cxLookAndFeelPainters; 

procedure SetRowNumber(var ASender: TcxGridTableView; AViewInfo: TcxCustomGridIndicatorItemViewInfo; 
  var ACanvas: TcxCanvas; var ADone: boolean); 
var 
  AIndicatorViewInfo: TcxGridIndicatorRowItemViewInfo; 
  ATextRect: TRect; 
  AFont: TFont; 
  AFontTextColor, AColor: TColor; 
begin 
  AFont := ACanvas.Font; 
  AColor := clBtnFace; 
  AFontTextColor := clWindowText ; 
if (AViewInfo is TcxGridIndicatorHeaderItemViewInfo) then begin 
  ATextRect := AViewInfo.Bounds; 
  InflateRect(ATextRect, -1, -1); 
     
   ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.Bounds, 
    ATextRect, [], cxBordersAll, cxbsNormal, taCenter, vaCenter, 
    False, False, '序号', AFont, AFontTextColor, AColor); 
    ADone := True; 
  end ; 
  if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then 
    Exit; 
  ATextRect := AViewInfo.ContentBounds; 
  AIndicatorViewInfo := AViewInfo as TcxGridIndicatorRowItemViewInfo; 
  InflateRect(ATextRect, -1, -1); 
  ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds, 
    ATextRect, [], [bBottom, bLeft, bRight], cxbsNormal, taCenter, vaCenter, 
    False, False, IntToStr(AIndicatorViewInfo.GridRecord.Index + 1), 
    AFont, AFontTextColor, AColor); 
  ADone := True; 
ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas, ATextRect, AIndicatorViewInfo.IndicatorKind); 
end;

如果你不要行标志的话,你可以不改控件 
直接注释掉这一行: ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas, ATextRect, AIndicatorViewInfo.IndicatorKind); 
要标志的话,在DrawIndicatorImage 从这里跟进去(Ctrl+左键单击) 
在 cxLookAndFeelPainters 单元中作如下修改: 

class procedure TcxCustomLookAndFeelPainter.DrawIndicatorImage(ACanvas: TcxCanvas; 
  const R: TRect; AKind: TcxIndicatorKind); 
var 
  X, Y: Integer; 
begin 
  if AKind = ikNone then Exit; 
  with cxIndicatorImages, R do 
  begin 
    X := (Left + Right - Width);              //靠右 
    Y := (Top + Bottom - Height) div 2;       //居中 
  end; 
  cxIndicatorImages.Draw(ACanvas.Canvas, X, Y, Ord(AKind) - 1); 
end;

注意,我已注明靠右的那一行, 就是去掉 DIV 2 了, 
还要改一个地方: 
SKIN控件目录下的dxSkinLookAndFeelPainter单元,找到 
TdxSkinLookAndFeelPainter.DrawIndicatorImage 函数 
的 
OffsetRect(ARect, (Left + Right - cx div 2) , (Top + Bottom - cy) div 2); 
这一行,将 (Left + Right - cx div 2) 改为(Left + Right - cx) 也是去掉 div 2 就是靠右; 
修改后: OffsetRect(ARect, (Left + Right - cx) , (Top + Bottom - cy) div 2); 

使用 

1 procedure TForm1.cxGrid1DBTableView1CustomDrawIndicatorCell( 
2   Sender: TcxGridTableView; ACanvas: TcxCanvas; 
3   AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean); 
4 begin 
5      SetRowNumber(Sender,AviewInfo,ACanvas,ADone); 
6 end; 

另外序号列的列宽最好改为35!



效果图:

原文地址:https://www.cnblogs.com/jijm123/p/10425011.html