El gif animado en el botón se detiene después de mover (volver a dibujar) el formulario

StackOverflow https://stackoverflow.com/questions/834353

  •  08-07-2019
  •  | 
  •  

Pregunta

Tengo un gif animado colocado en el botón. Está animando bien (la mayoría de las veces: P) pero cuando la ventana se vuelve a dibujar (repinta) la animación se detiene. Intenté actualizar el botón (button.Refresh ()) mientras manejaba el evento Paint pero no resolvió el problema. \

¿Alguien sabe cómo solucionar esto?

¿Fue útil?

Solución

Tal vez me equivoque, pero creo que el problema es que deja de animar no cuando el formulario se vuelve a dibujar, sino cuando el objeto animado está oculto por otra ventana. Este es el comportamiento previsto; El error es que en Windows Vista y Windows 7, la pantalla está compuesta, por lo que a pesar de que la ventana estaba `` oscurecida '', nunca se oscureció realmente, y nunca recibirá mensajes de pintura cuando no esté oscurecida, lo que reiniciará la animación.

Este error parece afectar a cualquier control derivado de ButtonBase con un objeto animado.

El problema es la función Control.IsWindowObscured. Volverá cierto. Puede ver en el archivo ButtonBase.cs, en System.Windows.Forms.ButtonBase.OnFrameChanged, hay una línea de código al final que dice:

if (IsWindowObscured) {
 StopAnimate();
 return;
}

y ahí radica el problema.

Para su información, se llama a OnFrameChanged desde el hilo ImageAnimator. Esta es la devolución de llamada que se especifica en ImageAnimator.Animate (image, eventhandler). ButtonBase configura esto en la función privada anular animate (bool animate). El subproceso de ImageAnimator sondea cada 50 ms y comprueba si es necesario un nuevo marco para cualquiera de las imágenes que está supervisando; si es así, establece una bandera para invalidar el control y dibujar el nuevo marco.

Dado que esto es inaccesible para nosotros, no creo que podamos hacer mucho al respecto. Como solución alternativa, implementé un temporizador en mi forma que invalida el control cada 500 ms, por lo que lo obligará a reiniciarse si se había detenido previamente. Es bastante molesto que no podamos anularlo o incluso acceder a él. Me temo que la única solución es el truco anterior, o crear o utilizar un control creado por usted o un tercero.

Para aclarar: este es solo un problema en Windows Vista o Windows 7 que utiliza la composición de escritorio. El problema es que las ventanas nunca están realmente oscurecidas, como cuando no se usa la composición de escritorio. Siempre los guarda el administrador de ventanas. (Hay ventanas especiales en capas en Windows 2000+, pero ignore eso por ahora). Anteriormente, las partes de una ventana no estaban disponibles si no estaban en la pantalla o estaban ocultas por otra ventana. Cuando volvieron a la vista, cambiando el enfoque o la posición, etc., el sistema notificará a esa área para que se repinte. Sin embargo, cuando se usa la composición de escritorio, nunca se requiere volver a pintar, ya que el contenido real de la ventana se almacena en otra parte. Es por eso que las vistas previas de la ventana funcionan en la barra de tareas y Flip-3d, por ejemplo. El efecto secundario es que el código que espera recibir un mensaje de pintura cuando es visible una vez más después de estar oculto fallará. El código de ButtonBase espera recibir un mensaje de pintura una vez que vuelva a aparecer, lo que comenzará la animación nuevamente. Y por lo tanto, esta optimización se convirtió en un error.

El problema debe informarse en Microsoft Connect, aunque es poco probable que se resuelva.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top