Wie mache ich einen TFrame (und alles darauf) teilweise transparent?

Ich habe ein Objekt bestehend aus aTFramedarauf aTPanel und darauf aTImage. Dem ist eine Bitmap zugeordnetTImage mit einer Pianorolle. Dieses Frame-Objekt wird auf a gelegtTImage, mit einem Bild, das ein Raster enthält. Ein Beispiel finden Sie im Bild.

Frage: Ist es möglich, den Rahmen teilweise transparent zu machen, sodass das Hintergrundbild mit dem Raster (im Hauptformular) undeutlich sichtbar ist? Im Idealfall kann der Grad der Transparenz vom Benutzer eingestellt werden. Die Bitmap ist 32 Bit tief, aber das Experimentieren mit dem Alphakanal hat nicht geholfen. Das Panel ist nicht zwingend erforderlich. Es wird verwendet, um das Objekt schnell mit einem Rand zu umgeben. Ich könnte das auf das Bild zeichnen.

Update 1 Ein kleines Codebeispiel wurde hinzugefügt. Das Hauptgerät zeichnet einen Hintergrund mit vertikalen Linien. Die zweite Einheit enthält einen TFrame und ein darauf befindliches TImage, das eine horizontale Linie zeichnet. Was ich sehen möchte, ist, dass die vertikalen Linien teilweise durch das TFrame-Bild scheinen.

Update 2 Was ich in meiner ursprünglichen Frage nicht angegeben habe: Der TFrame ist Teil einer viel größeren Anwendung und verhält sich unabhängig. Es wäre hilfreich, wenn das Transparenzproblem vom TFrame selbst gelöst werden könnte.

///////////////// 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.

Update 3 Ich hatte gehofft, dass es irgendeinen Nachrichten- oder API-Aufruf geben würde, der zu einer Lösung führen würde, die das Steuerelement teilweise transparent machen könnte, wie es die WMEraseBkGnd-Nachricht für vollständige Transparenz tut. In ihren Lösungen weisen sowohl Sertac als auch NGLN auftransparenz simulieren mit der AlphaBlend-Funktion. Diese Funktion führt zwei Bitmaps zusammen und erfordert daher die Kenntnis des Hintergrundbildes. Jetzt hat mein TFrame eine zusätzliche Eigenschaft:BackGround: TImage das wird von dem übergeordneten Steuerelement zugewiesen. Das gibt das gewünschte Ergebnis (es ist sooo professionell zu sehen, wie es funktioniert :-)

RRUZ zeigt auf die Graphics32-Bibliothek. Was ich gesehen habe, bringt fantastische Ergebnisse, für mich ist die Lernkurve zu steil.

Vielen Dank für Ihre Hilfe!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage