GUI con fondo animado

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

GUI con fondo animado

Mensaje por Ximorro »

Aprendiendo GDI+ (aunque sigo teniéndole manía) he hecho este pequeño efecto de poner un fondo animado a una ventana.

Tiene este aspecto, esto es una captura estática, lógicamente cuando se ejecuta se mueve :smt005
FondoAnimado.PNG
FondoAnimado.PNG (24.3 KiB) Visto 2960 veces
Os muestro 4 versiones de hacer el mismo efecto. El problema de las tres primeras es que los controles normales del GUI parpadean (en cada versión menos). El problema del último ¡que no parpadea nada! es que la programación se complica un poco...

Lo ideal sería hacer funcionar el primero sin parpadeo, ¿quizás algún truquito con WM_PAINT?, pues es el más fácil de programar, creo.

El que quiera ver el efecto mejor conseguido puede poner directamente la última versión "4FondoAnimado2BufferRegiones.au3". Podéis cambiar el número de bolitas cambiando el valor de la variable $BOLAS, mientras la CPU dé abasto para dibujarlas en el tiempo de la función Adlib no hay problema, depende del ordenador, yo en uno podía poner unas 300, en otro he llegado a poner 1000. Si os pasáis el GUI deja de responder y hay que matar el proceso (se puede hacer desde el icono de la bandeja). De todas maneras eso sólo sirve para ver lo suave que va la última versión independientemente del número de bolas, si se ponen muchas no queda muy bonito.

Uso AutoIt 3.3.0, para versiones modernas si da error de compilación cambiad AdlibEnable por AdlibRegister.

Al final del post tenéis un RAR con los 4 códigos.

Para los programadores, y especialmente a los que me quieran ayudar a mejorarlo, os explico qué he hecho en cada versión. Como digo lo ideal sería hacer que el primero no parpadee, o quizás el del doble búfer, eso facilitaría mucho la programación.


Las versiones son éstas:

1FondoAnimado.au3
Dibuja directamente en el graphics del GUI, pinta todas las bolas y cuando acaba fuerza un WM_PAINT.

2FondoAnimadoCadaBola.au3
En vez de repintar todo el fondo borra cada bola independientemente y la redibuja en su nueva posición, actualizando para cada bola. Con pocas bolas va mejor que el anterior, porque sólo invalida las zonas ocupadas por las mismas, con lo que sólo parpadean las partes del GUI que interseccionan con las bolitas, y no todo el GUI como pasaba antes. Eso sí, con muchas bolas es casi peor, pues igual está afectado casi todo el GUI y se hace más trabajo.

3FondoAnimado2Buffer.au3
Es como la primera versión pero usando un búfer intermedio para pintar el fondo, copiando todas las actualizaciones de una vez en el graphics del GUI con un simple _GDIPlus_GraphicsDrawImage. Desgraciadamente sigue parpadeando, aunque he visto que en ordenadores algo más lentos parpadea menos que la primera versión.

4FondoAnimado2BufferRegiones.au3
¡Esta versión no parpadea nada! El truco está en excluir de GDI+ las regiones ocupadas por los controles. Resulta que hay funciones similares en GDI+ a las de WinAPI de regiones, que ya había usado, pero en vez de afectar a una ventana afecta a un objeto Graphics. También es necesario usar el doble búfer, para que no se vea cómo se van dibujando los objetos independientes, y no parpadee al borrar el gráfico al principio del frame (el _GDIPlus_GraphicsClear).
PROBLEMA: al excluir los controles, los de fondo transparente dejan de serlo. Así que si quieres efectos similares hay que dibujar esos controles con GDI+ después de dibujar las bolitas. Por ejemplo para el GROUP he tenido que hacer un recuadro (y un label normal). Para los labels transparentes... pues toca dibujar los textos, ¡y es un rollo! No me gusta nada lo de crear montones de objetos más, además que hay que dibujar todos esos controles del GUI ¡cada vez!. Una etiqueta normal, no transparente (como el título del grupo), la creas con GUICtrlCreateLabel y te olvidas de ella.
Atención: ¡ESTA VERSIÓN NO USA WM_PAINT!. Como no hay que repintar los controles normales del GUI, pues no son machacados por los dibujos de GDI+, esta parte se simplifica.


En Vista los tres primeros me van casi igual, aunque en XP (y procesador más lento, también puede ser importante) el parpadeo es más notorio en el primero y menos en el tercero. El cuarto va aparte, ese va "perfecto". :smt003

La función para el brush con degradado de la bolita esa tan chula es de UEZ, al que adoro como un DIOS del GDI+, nos os perdáis sus ejemplos en:
http://www.autoitscript.com/forum/index ... opic=87200

La bola en sí también está cogida de su ejemplo, más o menos, porque no entendía mucho el código y lo he rehecho un poco.

¡Pero todo lo demás es mío! :smt024

¡Ya me diréis!
Adjuntos
FondoAnimado.rar
(7.97 KiB) Descargado 374 veces
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: GUI con fondo animado

Mensaje por Chefito »

Jejejeje.....muy muy muy chulo el efecto :smt002 .
He probado los códigos en un AMD 1300 y el cuarto va de lujo :smt023 . Muy buena técnica la de utilizar regiones.
Los otros van bastante mal. Sobre todo el primero. A mi personalmente me va fatal. Se redibuja muy lentamente, no se ven los controles y, encima, bloquea el formulario.
No se si se podría hacer algo con los otros códigos. Luego lo investigo. Es que ahora no tengo mucho tiempo. Es fería en mi tierra, y la fería de aquí no es moco de pavo. Todo el día de fiesta (http://www.albacete.es/site/295/program ... =feria2010) :smt005 .

Por cierto, ya vi hace tiempo los ejemplos de UEZ. La verdad es que son una chulada.

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

Re: GUI con fondo animado

Mensaje por Ximorro »

Gracias, no ha quedao mal :smt002

Vaya pues sí que decae en procesadores lentos. Yo en el que puedo poner hasta unas 300 bolas los 3 primeros van más o menos bien con pocas bolas, aunque el parpadeo molesta algo.

El de las regiones la verdad es que sorprende, si en un 1300 va bien me deja impresionao...
Desgraciadamente es un poco rollo lo de poner los textos y marcos en cada frame.

¡Felices fiestas!
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder