Como fazer um TFrame (e tudo nele) parcialmente transparente?
Eu tenho um objeto que consiste em umTFrame
, sobre issoTPanel
e nisso umTImage
. Um bitmap é atribuído aoTImage
contendo um rolo de piano. Este objeto-quadro é colocado em umTImage
, contendo uma imagem que contém uma grade. Veja a imagem para um exemplo.
Pergunta: É possível tornar o quadro parcialmente transparente, para que a imagem de fundo que contém a grade (no formulário principal) seja vagamente visível? Idealmente, a quantidade de transparência pode ser definida pelo usuário. O bitmap é de 32 bits, mas a experiência com o canal alfa não ajudou. O painel não é estritamente necessário. É usado para rapidamente ter uma borda ao redor do objeto. Eu poderia desenhar isso na imagem.
Atualização 1 Um pequeno exemplo de código é adicionado. A unidade principal desenha um fundo com linhas verticais. A segunda unidade contém um TFrame e um TImage que desenha uma linha horizontal. O que eu gostaria de ver é que as linhas verticais brilhem parcialmente através da imagem TFrame.
Atualização 2 O que eu não especifiquei na minha pergunta original: o TFrame faz parte de uma aplicação muito maior e se comporta de forma independente. Ajudaria se a questão da transparência pudesse ser tratada pelo próprio TFrame.
///////////////// Main unit, on mouse click draw lines and plot TFrame
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,
Unit2;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var background: TBitmap;
f: TFrame2;
i, c: Int32;
begin
background := TBitmap.Create;
background.Height := Image1.Height;
background.Width := Image1.Width;
background.Canvas.Pen.Color := clBlack;
for i := 0 to 10 do
begin
c := i * background.Width div 10;
background.Canvas.MoveTo (c, 0);
background.Canvas.LineTo (c, background.Height);
end;
Image1.Picture.Assign (background);
Application.ProcessMessages;
f := TFrame2.Create (Self);
f.Parent := Self;
f.Top := 10;
f.Left := 10;
f.plot;
end;
end.
///////////////////Unit containing the TFrame
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TFrame2 = class(TFrame)
Image1: TImage;
procedure plot;
end;
implementation
{$R *.dfm}
procedure TFrame2.plot;
var bitmap: TBitmap;
begin
bitmap := TBitmap.Create;
bitmap.Height := Image1.Height;
bitmap.Width := Image1.Width;
bitmap.PixelFormat := pf32Bit;
bitmap.Canvas.MoveTo (0, bitmap.Height div 2);
bitmap.Canvas.LineTo (bitmap.Width, bitmap.Height div 2);
Image1.Picture.Assign (bitmap);
end;
end.
Atualização 3 Eu esperava que houvesse alguma mensagem ou chamada de API que resultasse em uma solução que o controle poderia tornar-se parcialmente transparente, como a mensagem WMEraseBkGnd faz para transparência completa. Em suas soluções tanto a Sertac quanto a NGLN apontamsimulando transparência com a função AlphaBlend. Essa função mescla dois bitmaps e, portanto, requer um conhecimento da imagem de plano de fundo. Agora meu TFrame tem uma propriedade extra:BackGround: TImage
que é atribuído pelo controle pai. Isso dá o resultado desejado (é tão profissional vê-lo funcionando :-)
RRUZ aponta para a biblioteca Graphics32. O que eu vi produz resultados fantásticos, para mim a curva de aprendizado é muito íngreme.
Obrigado a todos pela vossa ajuda!