PDA

Ver la Versión Completa : skins


VRO
13-05-2008, 08:44:37
Hola, que tal??

Vereis estoy intentendo cambiar la apariencia de mi aplicación hecha con Delphi 6 y quisiera saber como hacer un Skin. No quiero bajarmelo de internet, sino que quiero hacer mi propio diseño.
¿ Cómo lo podria hacer? ¿ Qué código se utiliza?

Os rogarái me dieseís cualquier tipo de información.


Gracias, de antemano

Paulao
13-05-2008, 16:03:17
Ve si estes ejemplo lo sirven? Yo tengo un archivos llamado de "Dicas em Delphi(No se como se dice Dicas en Español)". Yo nunca he intentado hacerlo, pero mi amigo dice que funciona, pero usted pode mejorar. Esto es solo un ejemplo simples, cabe a usted usar su imaginacion. Alguna cosa esta escrito en Portugues(Texto original), pero es simples entender.

Aqui iremos tratar da criação de um componente SKIN como os do WINAMP. Para montar os SKINS devemos utilizar um Bitmap e deixar as bordas do formulários transparentes (ocultas).

A solução é bem simples, utilizando o componente Timage, dê uma olhado no fonte:

unit SkinImage;
interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,
ExtCtrls;

type
TSkinImage = class(TImage)
private

protected
{ Protected declarations }
function BitmapToRegion(bmp: TBitmap) : dword;
procedure OwnerShow(Sender : TObject);
public
constructor Create(AOwner : TComponent); override;
published
{ Published declarations }
end;

procedure Register;

var
Ready : Boolean;

implementation

procedure Register;
begin
RegisterComponents('CLINICA DELPHI', [TSkinImage]);
end;

{ TSkinImage }

constructor TSkinImage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if NOT (csDesigning in ComponentState) then
with TForm(AOwner) do
begin
BorderStyle := bsNone;
Self.Top := 0;
Self.Left := 0;
OnShow := OwnerShow;
end;
end;

function TSkinImage.BitmapToRegion(bmp: TBitmap) : dword;
var ix,iy : integer; // loop nas variáveis
tc : TColor; // transparentColor
b1 : boolean; // está olhando o "real"
pixels (no transparent pixels)
c1 : cardinal; // ajusta a variável na região
i1 : integer; // primeira posição real em pixel
begin
Result := 0;
i1 := 0;
// memória do transparent color
tc := bmp.transparentColor and $FFFFFF;
with bmp.canvas do
// enquadrilhe por todas as linhas
for iy := 0 to bmp.height - 1 do
begin
b1 := False;
// esquadrinhe por todo o pixels nesta linha
for ix:=0 to bmp.Width - 1 do
// feito nós acharmos o começo/final seguidos em pixel
if (pixels[ix, iy] and $FFFFFF <> tc) <> b1 then begin
// sim, e foi o último pixel,
// so nós podemos somar uma região de estilo de linha. . .
if b1 then begin
c1:=CreateRectRgn(i1,iy,ix,iy+1);
if result<>0 then
begin
// Esta não é a primeira região
CombineRgn(Result, Result, c1, RGN_OR);
DeleteObject(c1);
// Esta é a primeira região
end
else
Result := c1;
end else i1 := ix;
// mude o modo e procura o primeiro ou último pixel?
b1:=not b1;
end;
// o último pixel nesta fila era um pixel real?
if b1 then begin
c1:=CreateRectRgn(i1, iy, bmp.width-1, iy+1);
if (Result <> 0) then
begin
CombineRgn(Result, Result, c1, RGN_OR);
DeleteObject(c1);
end
else
Result := c1;
end;
end;
end;

procedure TSkinImage.OwnerShow(Sender: TObject);
var
Region : HRGN;
begin
if NOT Ready then
begin
Ready := True;
Region := BitmapToRegion(Picture.Bitmap);
SetWindowRgn(TForm(Owner).Handle, Region, True);
DeleteObject(Region);
end;
end;

initialization
Ready := False;
end.


" Digamos a primeira linha de nosso bitmap se parece:

000XXXXX00XXXXX000000XXXX000

0 -> Pixel Trasparente; X -> Pixel Colorido



Agora minha função passa por esta linha e cria uma região de janela para cada fila de pixels. No exemplo, nós adquiriríamos 3 regiões (4-8, 11-15, 22-25).

Nós fizemos o mesmo para todas as outras linhas no Bitmap, e todas essas regiões.

cHackAll
13-05-2008, 17:38:02
..."Dicas em Delphi" (No se como se dice Dicas en Español)...

Utiliza el Google Translate (http://www.google.com/translate_t?sl=pt&tl=es) amigo Paulao; y gracias por compartir ese código. :)

PD; para resaltar la sintaxis Delphi usa las etiquetas [delph¡]CODIGO[/delph¡].

Saludos

VRO
14-05-2008, 09:33:52
Muchas gracias, ahora tengo que adaptarlo a la forma que yo quiero.

Asi que manos a la obra.

Gracias por todo

Neftali [Germán.Estévez]
14-05-2008, 13:25:32
En el blog de Carlos García Trujillo (http://cgarcia.blogspot.com/2006/03/alternativas-los-skins.html) tienes una entrada que explica con detalle y ejemplos cómo comenzar con un sistema de Skins.

VRO
16-05-2008, 16:19:08
Eso es justo lo que necesitaba, ahora queda ajustarlo a todos los componentes que tengo yo en la aplicación y listo.



Muchísimas gracias.