Problemas con fondo mas imagen (transparente)

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
jonuba
Mensajes: 14
Registrado: 01 Oct 2011, 05:24

Problemas con fondo mas imagen (transparente)

Mensaje 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
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problemas con fondo mas imagen (transparente)

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
jonuba
Mensajes: 14
Registrado: 01 Oct 2011, 05:24

Re: Problemas con fondo mas imagen (transparente)

Mensaje 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
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Problemas con fondo mas imagen (transparente)

Mensaje 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...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder