This is an example for BGRAImageButton, you can use your own drawing procedure with BGRABitmap or the graphic library you want and then put the drawing in a BGRAImageButton.
First add a BGRAImageButton, then go OnCreate event and add this code:
procedure TForm1.FormCreate(Sender: TObject);
procedure DrawImageInside(ABtn:TBGRAImageButton);
var
image,textimage: TBGRABitmap;
begin
// Shape
image:= TBGRABitmap.Create(ABtn.Width,ABtn.Height*4);
image.FillRoundRectAntialias(0,0,BGRAImageButton1.Width-1,ABtn.Height-1,20,20,BGRA(0,128,255,255),[rrTopRightSquare,rrBottomLeftSquare]);
image.FillRoundRectAntialias(0,ABtn.Height,ABtn.Width-1,ABtn.Height*2-1,20,20,BGRA(128,128,255,255),[rrTopRightSquare,rrBottomLeftSquare]);
image.FillRoundRectAntialias(0,ABtn.Height*2,ABtn.Width-1,ABtn.Height*3-1,20,20,BGRA(0,64,128,255),[rrTopRightSquare,rrBottomLeftSquare]);
image.FillRoundRectAntialias(0,ABtn.Height*3,ABtn.Width-1,ABtn.Height*4-1,20,20,BGRA(100,100,100,255),[rrTopRightSquare,rrBottomLeftSquare]);
// Text
textimage:= TextShadow(ABtn.Width,ABtn.Height,'Button',Round(ABtn.Height div 2),BGRAWhite,BGRABlack,1,1,1);
image.PutImage(0,0,textimage,dmDrawWithTransparency);
image.PutImage(0,ABtn.Height,textimage,dmDrawWithTransparency);
image.PutImage(1,ABtn.Height*2+1,textimage,dmDrawWithTransparency);
image.PutImage(0,ABtn.Height*3,textimage,dmDrawWithTransparency);
textimage.Free;
// Draw Image
ABtn.Bitmap.LoadFromBitmapHandles(image.Bitmap.Handle,0);
image.Free;
end;
begin
DrawImageInside(BGRAImageButton1);
end;
Basically this creates the Bitmap according to provided BGRAImageButton width / height. Then draws a rounded shape with different colors in the exact position for each state (normal, enter, pressed, disabled). Finally put some text for each state and set the image in the BGRAImageButton.
The result is attached 'customshape.png'.
Remember you can use external images, like photoshop buttons.