Ho un oggetto costituito da TFrame
, su di esso un TPanel
e su quello a TImage
. Una bitmap è assegnata allo TImage
contenente un rullo di pianoforte. Questo oggetto frame viene inserito in un TImage
, contenente un'immagine che contiene una griglia. Guarda l'immagine per un esempio.Come rendere un TFrame (e qualsiasi cosa su di esso) parzialmente trasparente?
Domanda: E 'possibile rendere il telaio parzialmente trasparente, in modo che l'immagine di sfondo contenente la griglia (nella maschera principale) è vagamente visibile? Idealmente la quantità di trasparenza può essere impostata dall'utente. La bitmap ha una profondità di 32 bit, ma la sperimentazione con il canale alfa non ha aiutato. Il pannello non è strettamente necessario. È usato per avere rapidamente un bordo attorno all'oggetto. Potrei disegnarlo sull'immagine.
Aggiornamento 1 Viene aggiunto un esempio di codice ridotto. L'unità principale disegna uno sfondo con linee verticali. La seconda unità contiene una TFrame e una TImage su di essa che disegna una linea orizzontale. Quello che mi piacerebbe vedere è che le linee verticali brillano parzialmente attraverso l'immagine TFrame.
Aggiornamento 2 Cosa non ho specificato nella mia domanda iniziale: il TFrame fa parte di un'applicazione molto più grande e si comporta in modo indipendente. Sarebbe utile se il problema della trasparenza potesse essere gestito dalla TFrame stessa.
///////////////// 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 avevo sperato che ci sarebbe qualche messaggio o API chiamata che comporterebbe una soluzione che il controllo potrebbe rendersi parzialmente trasparente, come il messaggio WMEraseBkGnd fa completa trasparenza. Nelle loro soluzioni, sia Sertac che NGLN puntano entrambi a simulando la trasparenza con la funzione AlphaBlend. Questa funzione unisce due bitmap e quindi richiede una conoscenza dell'immagine di sfondo. Ora la mia TFrame ha una proprietà aggiuntiva: BackGround: TImage
assegnata dal controllo principale. Ciò dà il risultato desiderato (è talmente professionale vederlo funzionare :-)
RRUZ punta alla libreria Graphics32. Quello che ho visto produce risultati fantastici, per me la curva di apprendimento è troppo ripida.
Grazie a tutti per il vostro aiuto!
Quello che stai cercando è generalmente risolto usando i livelli, prova a usare la libreria [Graphics32] (http://sourceforge.net/projects/graphics32/) che supporta i livelli. – RRUZ
Ci sono 2 tempi? –
@RRUZ, ho provato più volte a capire Graphics32, ma è semplicemente troppo difficile per me. Speravo che ci fosse una soluzione comprensibile per me :-) – Arnold