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!

questionAnswers(3)

yourAnswerToTheQuestion