Pregunta

Estoy tratando de crear algunos formularios con máscara (solo el borde y el título) con un enfoque diferente al que normalmente ve, pero tengo algunos problemas con el parpadeo del formulario mientras cambio el tamaño del formulario.

No sé cómo explicar el problema, así que aquí hay un video que creé para demostrar el problema: http://www.screencast.com/t/AIqK9Szmz

Además, aquí hay una solución de prueba VS2008 con el código completo que vuelve a pintar los bordes del formulario: http: //stuff.nazgulled.net/misc/TestForm.zip

Espero que alguien pueda ayudarme a deshacerme del parpadeo ...

¿Fue útil?

Solución

(Esta es una solución específica de Vista; solo funciona cuando la composición de escritorio está habilitada).

Parece que Windows inicializa el contenido de los formularios redimensionados copiando los píxeles en el borde original del formulario a las nuevas áreas. En su caso, las nuevas áreas se inicializan en negro probablemente porque el formulario originalmente tenía píxeles negros en su borde.

Para deshacerse del parpadeo, solo mantenga la línea de píxeles más a la derecha e inferior en el formulario siempre configurada en TransparencyKey; esto mantendrá las nuevas áreas transparentes hasta que tenga la oportunidad de volver a pintarlas. Es decir, hacer que el formulario sea 1 píxel más ancho & amp; más alto de lo necesario y pinta los píxeles adicionales de forma transparente.

Ejemplo: TransparentForm.zip

Otros consejos

Eso es lo que uso en el constructor de mi formulario base:

this.SetStyle( ControlStyles.AllPaintingInWmPaint, true );
this.SetStyle( ControlStyles.UserPaint, true );
this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
this.SetStyle( ControlStyles.ResizeRedraw, true );

Creo que la clave es el uso de " AllPaintingInWmPaint " ;.

Si desea que su forma tenga una forma irregular, tendrá que pasar a regiones (si puede definir fácilmente la región de su forma usando formas geométricas como Círculo y Rectángulo). Cree un objeto System.Drawing.Graphics.Region y agréguele formas. Creo que la propiedad en el formulario se llama Región: asígnele la región que creó.

Su otra opción es usar ventanas en capas. Alguien ha hecho todo el trabajo por usted . Las ventanas en capas no funcionan en versiones de Windows anteriores a 2000, pero tienen el beneficio adicional de ser semitransparentes.

Su opción final es usar WPF y establecer AllowsTransparency = " True " WindowStyle = " Ninguno " ;. Eso eliminará el cromo (Google " ventana sin cromo WPF " por ejemplo, como un millón de ejemplos).

Finalmente, si eres valiente y paciente, siempre puedes capturar el escritorio detrás de tu ventana y pintarlo antes que nada. Tendrá que recurrir a algún hacker sofisticado si su ventana se mueve: Realmente no recomiendo este enfoque, pero necesita conocer todas sus opciones.

Tendrá que renunciar al uso de la propiedad Form.TransparencyKey si desea evitar el desagradable parpadeo de superposición de video negro no inicializado. No hace nada útil en su programa de muestra.

¿Intentó habilitar DoubleBuffering?

Ah, y por cierto, el uso del código SLIMcode no funcionará a menos que coloque toda su lógica de pintura en anular OnPaint (). Si esto no le suena familiar, probablemente no sepa que puede solicitar un repintado de manera forzosa llamando a Invalidate () en su formulario. Es una misión refactorizar su código en un solo método Paint, pero al final resulta en un código más limpio.

Para deshacerse del parpadeo mientras cambia el tamaño de la forma ganadora, suspenda el diseño mientras cambia el tamaño. Anule los métodos resizebegin / resizeend de los formularios como se muestra a continuación.

protected override void OnResizeBegin(EventArgs e) {
    SuspendLayout();
    base.OnResizeBegin(e);
}
protected override void OnResizeEnd(EventArgs e) {
    ResumeLayout();
    base.OnResizeEnd(e);
}

Esto dejará los controles intactos (como estaban antes del cambio de tamaño) y forzará un redibujo cuando se complete la operación de cambio de tamaño.

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