Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Imagen Semi Transparente con TrackBar (https://www.clubdelphi.com/foros/showthread.php?t=75286)

Roll462011 11-08-2011 00:00:24

Imagen Semi Transparente con TrackBar
 
Estimados Foristas:
Soy relativamente nuevo en el Foro y en la OOP con Delphi. Un cliente me ha pedido una pequeña aplicación para crear las identificaciones personales para nieveles de acceso a su Empresa y he utilizado un truco o mas bien un tutorial publicado de manera fenomenal por "escafandra" en DelphiAccess, titulado Transparencias. Mi gratitud por este valioso aporte.
Ahora, he logrado implementar un método OnChange de un TTrackBar con el objetivo de ir incrementando o disminuyendo la Transparencia de la imagen de fondo a gusto del cliente.
Para lograrlo en el Create del Formulario incluí entre otras esta línea:

Image4.Picture.Bitmap.Assign(Image2.Picture.Bitmap);

Con el objetivo de tener la imagen original disponible para aplicar un nivel de transparencia y en el OnChange del TrackBar puse lo siguiente:

Image2.Picture.Bitmap.PixelFormat := pf32bit;
Image2.Picture.Bitmap.Assign(Image4.Picture.Bitmap);
DrawSemiTransparent(Image2.Canvas, Image3.Picture.Bitmap, TrackBar1.Position);
Invalidate;

Esto me funciona bien, aunque no sé si será la más profesional, solo que para terminar con un toque de profesionalismo me gustaría que ustedes me lo evaluaran y me dieran su criterio, pero que además me ayuden a buscar una solución al parpadeo de la imagen mientras le cambio la transparencia:



Esta es la Imagen despues de aplicar la transparencia


escafandra 11-08-2011 07:50:59

Hola y bienvenido Roll462011.

Me alegra que ese tutorial acerca de las transparencias te haya perecido interesante.

Para evitar el parpadeo debes poner
Código Delphi [-]
Form1.Doublebuffered:= true
.

Yo utilizaría un TBitmap temporal para guardar la imagen original de esta manera:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    Image2: TImage;
    Image3: TImage;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    TmpBitmap: TBitmap;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure DrawSemiTransparent(Canvas: TCanvas; bmp: TBitmap; Percent: integer);
var
   bf: BLENDFUNCTION;
begin
   bf.BlendOp:= AC_SRC_OVER;
   bf.BlendFlags:= 0;
   bf.SourceConstantAlpha:= MulDiv($FF, Percent, 100);
   bf.AlphaFormat:= 0;
   Windows.AlphaBlend(Canvas.Handle, 0, 0, bmp.Width, bmp.Height, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, bf);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Doublebuffered:= true;
  TmpBitmap:= TBitmap.Create;
  TmpBitmap.Assign(Image3.Picture.Graphic);
  Image3.Picture.Bitmap.Assign(TmpBitmap);
  TmpBitmap.Assign(Image2.Picture.Graphic);
  TmpBitmap.PixelFormat := pf32bit;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Image2.Picture.Bitmap.Assign(TmpBitmap);
  DrawSemiTransparent(Image2.Canvas, Image3.Picture.Bitmap, TrackBar1.Position);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  TmpBitmap.Destroy;
end;

end.


Saludos.

Roll462011 12-08-2011 14:40:47

Ese era el toque que me faltaba
 
Oye Escafandra, no sé como agradecerte, en verdad tienes un dominio envidiable de la programación... cuando sea grande quiero ser como tú, jajajajaja

Gracias de verdad era lo que precisaba para terminar esta pequeña aplicación.

Ahora voy a cambiarla para SQL y leer desde el Sistema de la Nómina, los datos que están todos guardados allí, solo quiero agregar una Tabla al SQL para guardar los cambios en el entorno que el cliente definió en la interface como por ejemplo: Imagen del Fondo, Logo de la Compañia, Intensidad de la Transparencia, último registro visitado, etc
Se me ha ocurrido, y te consulto eh..., que cuando cambien el logo, permitirle dinámicamente modificar el tamaño y la posición del TImage que lo contiene pero no quiero complicarme poniendo un botón para el With, ni el Height, el Top o el Left; sino ponerle al TImage las rejillitas que se utiliza en los software de tratamiento gráfico que permiten redimensionarlos y moverlos a la posición que quieras


La franja horaria es GMT +2. Ahora son las 04:48:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi