Jak uczynić TFrame (i wszystko na nim) częściowo przezroczystym?

Mam obiekt składający się z aTFrame, na to aTPanel i na tymTImage. Bitmapa jest przypisana doTImage zawierające rolkę fortepianu. Ten obiekt ramki jest umieszczany na aTImage, zawierający obraz zawierający siatkę. Zobacz obraz jako przykład.

Pytanie: Czy jest możliwe, aby ramka była częściowo przezroczysta, aby obraz tła zawierający siatkę (na formularzu głównym) był niejasno widoczny? Idealnie, przezroczystość może być ustawiona przez użytkownika. Bitmapa ma głębokość 32 bitów, ale eksperymentowanie z kanałem alfa nie pomogło. Panel nie jest koniecznie konieczny. Służy do szybkiego obramowania obiektu. Mogę to narysować na obrazie.

Aktualizacja 1 Dodany jest mały przykład kodu. Jednostka główna rysuje tło z pionowymi liniami. Druga jednostka zawiera TFrame i TImage na niej, które rysują poziomą linię. Chciałbym zobaczyć, że pionowe linie częściowo świecą przez obraz TFrame.

Aktualizacja 2 Czego nie określiłem w moim pierwotnym pytaniu: TFrame jest częścią znacznie większej aplikacji i zachowuje się niezależnie. Byłoby pomocne, gdyby kwestia przejrzystości mogła być rozwiązana przez samą 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.

Aktualizacja 3 Miałem nadzieję, że pojawią się jakieś wiadomości lub wywołania API, które doprowadzą do rozwiązania, które może sprawić, że kontrola stanie się częściowo przezroczysta, tak jak komunikat WMEraseBkGnd dla pełnej przejrzystości. W swoich rozwiązaniach zarówno Sertac, jak i NGLN wskazują na tosymulowanie przejrzystości z funkcją AlphaBlend. Ta funkcja łączy dwie bitmapy i dlatego wymaga znajomości obrazu tła. Teraz moja TFrame ma dodatkową właściwość:BackGround: TImage przypisany przez kontrolę rodzicielską. Daje to pożądany rezultat (to bardzo profesjonalnie widzieć, że działa :-)

RRUZ wskazuje na bibliotekę Graphics32. To, co widziałem, daje fantastyczne rezultaty, dla mnie krzywa uczenia się jest zbyt stroma.

Dziękuję wszystkim za pomoc!

questionAnswers(3)

yourAnswerToTheQuestion