Página 1 de 1

Problemas con fondo mas imagen (transparente)

Publicado: 01 Oct 2011, 05:53
por jonuba
Hola
Hace poco que empeze con autoit y fui aprendiendo del manual y de este foro hasta hoy que no soy capaz.
Lo que quiero hacer es poner una imagen de fondo a una ventana y luego otra imagen (gif) sin movimiento pero mas pequeña encima de ese fondo con sus transparencias como si fuera un emoticon pero sin movimiento.
esto es lo que llege a conseguir:

Opt("GUIOnEventMode", 1)
GUICreate ("Menu", "600", "600", "-1", "-1")
GUICtrlCreatePic ("F:\fondo.JPG", "0", "0", "0", "0")
GUICtrlCreatePic ("f:\emoticono.gif", "50", "50")
GUISetOnEvent ($GUI_EVENT_CLOSE, "sysboton")
GUISetState(@SW_SHOW)

While 1

WEnd

Func sysboton()
Select
Case @GUI_CtrlId = $GUI_EVENT_CLOSE
Exit
EndSelect
EndFunc

con ese codigo aparecen las 2 imagenes un fondo y un gif pero el gif hace un cuadrado blanco a su alrededor en vez de ser transparente. Si en la parte del codigo
"GUICreate ("Menu", "600", "600", "-1", "-1")" le añado "$WS_EX_LAYERED" donde antes estaba blanco ahora es un agujero, vamos que transpasa el fondo .jpg.
e rebuscado en el manual pero no veo nada en el foro e buscado por transparencia y no consigo lo que quiero.
Cual es la solucion si la hay?
gracias por su colaboracion

Re: Problemas con fondo mas imagen (transparente)

Publicado: 01 Oct 2011, 19:34
por Chefito
Mmmmm....para hacer cosas de este tipo te recomiendo que trabajes con gdiplus. Busca en la ayuda las funciones que empiezan con _gdiplus_. Es una udf que trae autoit. Es algo complicado, pero con empeño se consigue resultados sorprendentes.

Puedes bajarte esta udf para trabajar con gifs (creditos a trancexx). Te facilitará mucho el trabajo: http://gif-animation.origo.ethz.ch/download/2869

Busca en el foro ingles cosas como: "image transparent", "gif transparent", etc. Seguro que te aparecen muchos temas.

Mira un ejemplo de nuestro colega monoscout999 (en nuestro foro está registrado como ms999). Puede que sea algo de lo que necesitas: http://www.autoitscript.com/forum/topic ... msearch__1

Como ves hay muchas posibilidades. Mira la udf gifanimate que seguro que te ayuda mucho.

Saludos.

Re: Problemas con fondo mas imagen (transparente)

Publicado: 02 Oct 2011, 02:01
por jonuba
hola
muchas gracias Chefito
con lo que me as indicado encontre la solucion e descrito lo que llege a entender del codigo.

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate ("Menu", 700, 700)
GUICtrlCreatePic ("F:\c.JPG", "0", "0", "0", "0") ;esto es la imagen de fondo esto es opcional

_GDIPlus_Startup () ;aqui iniciamos GDIplus
$hImage = _GDIPlus_ImageLoadFromFile("f:\no.gif") ; aqui cargamos la imagen .png y tambien funciona con .gif
$iWidth = _GDIPlus_ImageGetWidth($hImage) ;esto es opcional creo que lo que hace es poner el .png o .gif con las dimensiones originales
$iHeight = _GDIPlus_ImageGetHeight($hImage) ; lo mismo que el anterior tambien es opcional

GUISetOnEvent ($GUI_EVENT_CLOSE, "sysboton")
GUISetState(@SW_SHOW)

While 1
sleep (500) ; si no pongo el sleep se come toda la cpu
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;esto creo que lo que hace es cargar png o gif
_GDIPlus_GraphicsDrawImageRect ($hGraphic, $hImage, 0, 0, $iWidth, $iHeight) ;esto es para poner donde quieres png o gif ancho y alto
WEnd

Func sysboton()
Select
Case @GUI_CtrlId = $GUI_EVENT_CLOSE
Exit
EndSelect
EndFunc

un saludo y de nuevo gracias Chefito

Re: Problemas con fondo mas imagen (transparente)

Publicado: 03 Oct 2011, 09:27
por Ximorro
Por si te da alguna idea aquí en el foro hispano trabajábamos con transparencias con un PNG.
http://www.emesn.com/autoitforum/viewto ... toro#p9637

Ahí movíamos una imagen con transparencia en un formulario de fondo transparente (con lo que la imagen se movía sobre el escritorio). No conseguimos manejar las semitransparencias (las sombras) pero como en un GIF no hay de eso... ;-)

En el foro inglés tienes los ejemplos del maestro UEZ:
http://www.autoitscript.com/forum/topic ... using-gdi/

Para repintar en vez de hacerlo en el bucle te recomiendo parchear el mensaje WM_PAINT (por ejemplo en el enlace que te pongo antes lo hacía así). También verás esa técnica en muchos ejemplos de GDI+.
Con WM_PAINT el sistema repinta sólo cuando es necesario, y además lo hace en cuanto es necesario.
Usando el bucle (no lo recomiendo), lo que definitivamente tienes que sacar de ahí es lo de GraphicsCreateFromHWND. Eso basta hacerlo una vez, estás creando muchos objetos que luego además no liberas.

Y una cosa, con GDI hay una cosa muy penosa pero necesaria, hay que destruir todos los objetos creados, mira también los ejemplos. Son las funciones típicamente acabadas en Dispose, como _GDIPlus_BitmapDispose, _GDIPlus_GraphicsDispose, etc.
Y además un _GDIPlus_StartUp() debe ir emparejado con _GDIPlus_ShutDown ().
Si no haces esas cosas empezarás a comerte la memoria sin liberarla...

Advertencia: GDI es algo avanzado...