delphi组件顺序和层选项

delphi组件顺序和层选项,delphi,components,layer,Delphi,Components,Layer,我对delphi编程非常陌生: 我正在尝试制作一个自定义组件,它有一个透明的背景层和一个圆形的顶层。但是,将下面的代码添加到表单时,效果良好。 例外情况是,有另一个组件和自定义组件重叠或重叠在自定义组件之上,它位于下面,不显示。 我试过下面的表格 BadgeTest1.BringToFront; BadgeTest1.ComponentIndex:=2; IndexVal:= BadgeTest1.ComponentIndex; 但是,仍然不起作用。自定义组件是否显示在其他组件之上?只有

我对delphi编程非常陌生: 我正在尝试制作一个自定义组件,它有一个透明的背景层和一个圆形的顶层。但是,将下面的代码添加到表单时,效果良好。 例外情况是,有另一个组件和自定义组件重叠或重叠在自定义组件之上,它位于下面,不显示。 我试过下面的表格

 BadgeTest1.BringToFront;
 BadgeTest1.ComponentIndex:=2;
 IndexVal:= BadgeTest1.ComponentIndex;
但是,仍然不起作用。自定义组件是否显示在其他组件之上?只有圆形部分? 此外,我还尝试在自定义组件的中心水平和垂直位置放置标题,我尝试了TextOut过程。如果有更好的选择,你能告诉我吗? 下面是我为自定义组件BadgeTest编写的代码。 求求你,救命, 非常感谢你

type
 TBadgeTest=class(TGraphicControl)

private
  FCaption:TCaption;
  FColor:TColor;
  FLayers:TLayerCollection;
  FHeight:Integer;
  FWidth:Integer;

protected
 procedure Paint; override;  
  procedure SetBkgLayer;      
  procedure SetSecondLayer;       
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property Caption:TCaption read FCaption write FCaption; 
end;

procedure Register;

implementation

  procedure Register;
begin
  RegisterComponents('Sample', [TBadgeTest]);
end;

constructor TBadgeTest.Create(AOwner: TComponent);
var
  ACanvas:TcxCanvas;
   begin
   inherited;
   FHeight:=20;
  Self.Height:=FHeight;
  Constraints.MaxHeight:=20;
  Constraints.MinHeight:=20;
  FHeight:=20;
  Self.Width:=FWidth;
  Constraints.MaxWidth:=20;
  Constraints.MinWidth:=20;
end;

destructor TBadgeTest.Destroy;
begin
  inherited;
end;

 procedure TBadgeTest.SetBkgLayer;   
 var
  Bitmap:TBitmap32;
  Layer: TCustomLayer;
 begin
  FLayers := TLayerCollection.Create(Self);
  Layer := FLayers.Add(TBitmapLayer);
  Layer.Index:=0;
  Bitmap:= TBitmap32.Create;
  Bitmap.DrawMode:=dmOpaque;
  Bitmap.SetSize(Width, Height);
  Bitmap.clear($00000000);

  Bitmap.Canvas.Pen.Width:=0;
  Bitmap.Canvas.Brush.Color:=$00107EFF;
  Bitmap.Canvas.Brush.Style:=bsClear;
  Bitmap.Canvas.Ellipse(Rect(0,0,20,20));
end;

  procedure TBadgeTest.SetSecondLayer;
var
  Bitmap:TBitmap32;
  Layer: TCustomLayer;
 begin
  Layer := FLayers.Add(TBitmapLayer);
  Layer.Index:=1;
  Layer.LayerOptions:= LOB_VISIBLE;
  Bitmap:=TBitmap32.Create;
  Bitmap.DrawMode:=dmCustom;
  Bitmap.SetSize(Width, Height);
  Bitmap.clear($00000000);

  Bitmap.Canvas.Pen.Width:=0;
  Bitmap.Canvas.Brush.Color:=$00107EFF;   //FF7E10
  Bitmap.Canvas.Brush.Style:=bsSolid;
  Bitmap.Canvas.Ellipse(Rect(0,0,Self.Width,Self.Height));

  Layer.BringToFront;
  Layer.BringToFront;
  //Layer.Scaled:=true;
  //  Layer.Bitmap:=Bitmap;
  end;

    procedure TBadgeTest.Paint;
var
    R:TRect;
    borderColor : Integer;
    fillCircle : Integer;  
    fontColor : Integer;  
    fontSize : Integer;   
    Bitmap:TBitmapImage;
  const
  _FF7E10_COLOR:Integer = $00107EFF; //#FF7E10           

 begin
  inherited;
  borderColor:=_FF7E10_COLOR;
  fillCircle:=_FF7E10_COLOR;

  Canvas.Pen.Create;
  Canvas.Pen.Style:=psClear;
  Canvas.Pen.Color:=borderColor;
  Canvas.Pen.Width:=0;

  SetBkgLayer;
  SetSecondLayer;

  Canvas.Brush.Create;
  Canvas.Brush.Style:= bsClear;
  Canvas.Brush.Color:=fillCircle;
  Canvas.Ellipse(0,0,Self.Width,Self.Height);
  Canvas.Font.Color:=clWhite;
  Canvas.Font.Name:='Arial';
  Canvas.Font.Size:=8;
  Canvas.Font.Quality := fqNonAntialiased;
  Canvas.Font.Style := [fsBold];

  R.Create(0, 0, Self.Width, Self.Height);
  //DrawText(Canvas.Handle, PChar(FCaption), -1, R, vaCenter);
 // Canvas.DrawText(FCaption, R, taCenter, vaCenter, False, False);
  Canvas.TextOut(5, 5, FCaption);
  //SetTextAlign(Canvas.Handle, ta_center);
  //DrawText(Canvas.Handle, PChar(FCaption),
  //R.Create(1, 10, 2, 26);
   //  Self.Width := Canvas.TextWidth(FCaption) + 30;
end;
A没有窗口句柄,只是简单地绘制在其父DC上。 你不能在后代面前,比如TPanel、TButton、TEdit等

使用可以放在其他子TWinControl前面的控件,或者重新设计UI,以消除另一个TWinControl与自定义图形控件重叠或重叠在自定义图形控件之上的情况

注:可视控件是指控件,而不是非可视的组件。A没有窗口句柄,只是简单地绘制在其父DC上。 你不能在后代面前,比如TPanel、TButton、TEdit等

使用可以放在其他子TWinControl前面的控件,或者重新设计UI,以消除另一个TWinControl与自定义图形控件重叠或重叠在自定义图形控件之上的情况

注:可视控件是指控件,而不是非可视组件