Tengo un objeto que consiste en un TFrame
, en él un TPanel
y en eso un TImage
. Se asigna un mapa de bits al TImage
que contiene un piano roll. Este objeto de marco se pone en un TImage
, que contiene una imagen que contiene una cuadrícula. Vea la imagen para un ejemplo.¿Cómo hacer que un TFrame (y todo lo que contiene) sea parcialmente transparente?
Pregunta: ¿Es posible hacer el marco parcialmente transparente, de modo que la imagen de fondo que contiene la cuadrícula (en el formulario principal) es vagamente visible? Idealmente, la cantidad de transparencia puede ser establecida por el usuario. El mapa de bits tiene 32 bits de profundidad, pero la experimentación con el canal alfa no ayudó. El panel no es estrictamente necesario. Se usa para tener rápidamente un borde alrededor del objeto. Podría dibujar eso en la imagen.
Actualización 1 Se agrega un pequeño ejemplo de código. La unidad principal dibuja un fondo con líneas verticales. La segunda unidad contiene un TFrame y un TImage que dibuja una línea horizontal. Lo que me gustaría ver es que las líneas verticales brillan parcialmente a través de TFrame Image.
Actualización 2 Lo que no especifiqué en mi pregunta original: el TFrame es parte de una aplicación mucho más grande y se comporta de forma independiente. Ayudaría si la cuestión de la transparencia pudiera ser manejada por el propio 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.
Actualización 3 que había esperado que habría algún mensaje o llamada API que daría lugar a una solución que el control podría hacerse parcialmente transparente, al igual que el mensaje WMEraseBkGnd hace por una transparencia total. En sus soluciones, tanto Sertac como NGLN apuntan a simulando la transparencia con la función AlphaBlend. Esta función combina dos mapas de bits y, por lo tanto, requiere un conocimiento de la imagen de fondo. Ahora mi TFrame tiene una propiedad adicional: BackGround: TImage
asignada por el control principal. Eso le da el resultado deseado (es tan profesional verlo funcionar :-)
RRUZ apunta a la biblioteca Graphics32. Lo que he visto produce resultados fantásticos, para mí la curva de aprendizaje es demasiado empinada.
¡Gracias a todos por su ayuda!
Lo que está buscando generalmente se resuelve usando capas, intente utilizar la biblioteca [Graphics32] (http://sourceforge.net/projects/graphics32/) que admite capas. – RRUZ
¿Hay 2 TImages? –
@RRUZ, he intentado varias veces entender Graphics32, pero es demasiado difícil para mí. Esperaba que hubiera una solución comprensible para mí :-) – Arnold