Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Splash Screen - Con transparencias (tipo PhotoShop, etc...) (https://www.clubdelphi.com/foros/showthread.php?t=80841)

xEsk 07-10-2007 13:00:56

Splash Screen - Con transparencias (tipo PhotoShop, etc...)
 
Seguro que alguien se ha fijado que muchos programas, sus Splash Screen tienen sombras, transparencias, etc... como por ejemplo el PhotoShop, el CodeBlocks, etc...

Así pues, hoy por inspiración divina, me ha venido una imagen clara y facilísima de como hacerlo xD

La idea del truco es muy simple: Capturar la imagen del escritorio en el momento de mostrar el Splash, y encima de ésta, mostrar nuestra imagen.

Para la receta necesitamos:

El componente TPngImage (http://pngdelphi.sourceforge.net/). Cualquier otro componente que realice lo mismo que este, es valido.

Empecemos pues:

1- Creamos la imagen del SplashScreen.
2- Creamos un nuevo formulario (frmSplashScreen)
3- Configuramos el formulario: BorderStyle:=bsNone; y Position:=poScreenCenter; las dimensiones del form (width y height) deben ser iguales a las de la imagen.
4- Agregamos un "TImage" (imgDeskTop) que nos servirá para mostrar la captura de pantalla, y ponemos la propiedad: Center:=True;
5- Agregamos otro "TImage" (imgSplashScreen) para mostrar la imagen del Splash Screen.
6- Ahora, sólo nos queda el código para realizar el truco:
Código Delphi [-]
uses PngImage;

procedure TfrmSplashScreen.BuildSplashScreen;
  // get an screen shot
  function GetScreenShot: TBitmap;
  var
    Desktop: HDC;
  begin
    Result  := TBitmap.Create;
    Desktop := GetDC(0);
    try
      try
        Result.PixelFormat:=pf32bit;
        Result.Width:=Screen.Width;
        Result.Height:=Screen.Height;
        BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY);
        Result.Modified:=True;
      finally
        ReleaseDC(0, Desktop);
      end;
    except
      Result.Free;
      Result:=nil;
    end;
  end;
begin
  // get the current "desktop"
  imgDeskTop.Picture.Bitmap:=GetScreenShot;
  // load the "Splash Screen" picture
  imgSplashScreen.Picture.LoadFromFile('media\SplashScreen.png');
end;

El efecto es realmente bueno, pero tiene los mismos fallos que cualquier otro Splash Screen de este tipo: "Si se cambia el fondo mientras esta el Splash Screen abierto, este no se actualiza...".

Aqui una captura de pantalla del truco: http://www.upload-images.net/imagen/fa2a21e731.png

También he subido las fuentes (y un ejecutable) del truco en el Directorio del ClubDelphi, para quién lo quiera probar: http://www.terawiki.com/clubdelphi/archivos/Delphi-Win32/Ejemplos/SplashScreen_SplashScreen_con_transparencias_PNG.zip

Saludos.

pcpower 13-10-2007 16:35:10

La alternativa más usual y sencilla que se utiliza es poner el Form contenedor con BorderStyle:=bsNone, TransparentColorValue:=csXXX en algún color no utilizado en la imagen y TransparentColor=true
Saludos.

xEsk 13-10-2007 17:48:51

pcpower pero lo que tú propones, no soporta transparencias de varios niveles (para sombras, efecto de cristal, etc...), sólo: Transparente o no transparente.

Si te fijas en el ejemplo o en la imagen de muestra, veras a lo que me refiero.

Saludos.

Chris 17-10-2007 01:10:01

desde hace tiempo utilizo un truco parecido con TPNGImage, pero lo que hago de un forma un poco más simple y rápida.

Código Delphi [-]
Procedure Form1onCreate(Sender : TObject);
var
SplashImage : TPNGImage;
Begin
SplashImage := TPNGImage.create;
SplashImage.LoadFromFile('C:\splash.png'); //opcionalmente de los recursos de la aplicación

Self.Brush.style := bsClear; // da el mismo efecto que pintar el escritorio.
Self.Canvas.Draw(SplashImage);
end;

esa es la idea, no sé si el código está bien escrito porque lo hago de memoria, pero por ahí va.

pcpower 17-10-2007 19:05:48

Tienes razón xEsk. Es un efecto bastante màs complejo. Se me ocurre también que se podrían practicar efectos extraños sobre la pantalla capturada, como o un dimmeado, o borrarla como un pizarrón,o jugar con los ìconos obteniedo las posiciones en la pantalla de alguna manera, etc... Yo, de todos modos, si veo un programa que arranca así, tiro del cable de power de la PC inmediatamente!!! jeje
Saludos.

neuronic 26-02-2008 23:49:56

Buenas, el otro dia instale el windows live y su splashscreen me gusto, usa transparencia y por lo que eh podido observar si mueves la ventana de atras, refresca el splashscreen, intentare comprovar con el api spy haver si esta capturando pantalla todo el tiempo o bien es un form con el blend activado, see you

xEsk 28-02-2008 15:15:46

neuronic si descubres algo, sería interesante saberlo.

Saludos

coso 22-05-2008 15:54:24

si mientras se van creando las forms (Application.CreateForm...) vas poniendo update no se redibuja?

neuronic 23-05-2008 13:53:13

el splash screen de windows live, me parece que utiliza blend al form

Chris 27-05-2008 05:54:59

Al respecto, estuve leyendo un excelente artículo la semana pasada para conseguir este efecto. Mediante la llamada a la función API, UpdateLayeredWindow.

Pros:
* Es súper sencillo de implementar,
* Se encarga de dibujar automáticamente el canvas del form cuando se mueve una ventana o se cambia el Z-Order de éstas.
* Es relativamente rápido de implementar.
* Se pueden conseguir excelentes efectos incluso con BMP de 32bits.

Contras:
* Las ventanas que hagan uso de esta API, no pueden deberían de contener controles dentro de ellas (pues no se dibujan).
* Disponible solamente en win2k, XP y posteriores.

Aquí les dejo el enlace para que lo chequeen (en inglés).
http://melander.dk/articles/alphasplash/

Este es un artículo bien completo, incluso dedica casi la mitad de éste a explicarnos como hacer BMPs de 32bits en Photoshop.

Saludos a todos los del club. Bye.

xEsk 27-05-2008 12:25:18

D&W muy interesante, gracias.

Ñuño Martínez 30-07-2008 11:35:28

Una pregunta. ¿Y si se crea una ventana sin borde con el fondo totalmente transparente y se le dibuja encima la imagen del "splash"? Se me acaba de ocurrir.

Phacko 03-02-2012 02:17:34

Muy buenas aportaciones, lo que mas me agrada es el entusiasmo con que se comparten opiniones e ideas, son grandes.

Gracias


La franja horaria es GMT +2. Ahora son las 22:14:14.

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