Me he dado cuenta de que el componente TSkinButton estaba publicado en un foro restringido. He liberado el componente y ahora lo puedes encontrar en
este enlace.
Esto es un ejemplo gráfico del resultado:
El truco está en el uso de regiones recortando la parte visible de un bitmap, como muestra este código:
Código Delphi
[-]
procedure SkinControl(Control: TWinControl; bmp: TBitmap);
var
TransparentColor: DWORD;
rgn, rgnTemp: HRGN;
ini, x, y: integer;
Pixel: PADWord;
begin
bmp.HandleType:= bmDIB;
bmp.PixelFormat:= pf32bit;
Control.SetBounds(Control.Left, Control.Top, bmp.Width, bmp.Height);
TransparentColor:= PADWord(bmp.ScanLine[bmp.Height-1])[0];
rgn:= CreateRectRgn(0, 0, Control.Width, Control.Height);
CombineRgn(rgn, rgn, rgn, RGN_DIFF);
for y:=0 to bmp.Height-1 do
begin
Pixel:= PADWord(bmp.ScanLine[y]);
ini:= 0;
for x:=0 to bmp.Width-1 do
begin
if pixel[x] <> TransparentColor then
begin
rgnTemp:= CreateRectRgn(ini, y, x, y+1);
CombineRgn(rgn, rgn, rgnTemp, RGN_OR);
DeleteObject(rgnTemp);
ini:= x;
end
else inc(ini);
end;
end;
SetWindowRgn(Control.Handle, rgn, true);
DeleteObject(rgn);
end;
El proyecto de ejemplo y el código de TSkinButton lo encuentras
aquí.
Saludos.