Ver Mensaje Individual
  #6  
Antiguo 06-06-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita