2010-07-27 49 views

Respuesta

10

Sí, eso no funciona. Aquí está una clase que lo mejora un poco:

using System; 
using System.Windows.Forms; 

class MyFlowLayoutPanel : FlowLayoutPanel { 
    public MyFlowLayoutPanel() { 
     this.DoubleBuffered = true; 
    } 
    protected override void OnScroll(ScrollEventArgs se) { 
     this.Invalidate(); 
     base.OnScroll(se); 
    } 
} 

Compilar y dejarlo caer desde la parte superior de la caja de herramientas hasta el formulario. Sin embargo, no puede solucionar el problema fundamental, la opción "Mostrar contenido de la ventana mientras se arrastra". Esa es una opción del sistema, se encenderá para las versiones posteriores de Windows. Cuando está activado, Windows mismo desplaza el contenido del panel y luego le pide a la aplicación que dibuje la parte que fue revelada por el desplazamiento. El método OnScroll lo reemplaza, asegurando que toda la ventana se vuelva a pintar para mantener la imagen de fondo en su lugar. El resultado final no es bonito, verá la imagen haciendo el "pogo", saltando hacia arriba y hacia abajo mientras se desplaza.

La única solución para esto es desactivar la opción del sistema. No es una solución práctica, a los usuarios les gusta la opción y afecta a todos los programas, no solo a los suyos. Si no puedes vivir con el pogo, entonces tendrás que renunciar a la transparencia.

3

Estoy muy contento de informar que Hans, y el Internet en general (solo aprenda WPF .... pfffft), están equivocados aquí.

El problema está en los eventos WM_HSCROLL y WM_VSCROLL. A través de algunos intentos de prueba y error, descubrí que, si arrastraba la barra de desplazamiento lo suficientemente rápido, podía mover una copia fantasma de mi fondo sobre el fondo real, que estaba fxied como yo quería. Entonces, sea lo que sea que esté sucediendo dentro del control desplazable, Windows es capaz de mantenerse al día y lo que está causando el corte es un redibujado fuera de sincronización.

Entonces, ¿cómo resuelves este problema?

  1. Configure su control desplazable en DoubleBuffered.

  2. Captura los mensajes WM_HSCROLL/WM_VSCROLL. Invalidar. Establezca el indicador "do_not_paint" en verdadero. Llamar a la base.WndProc(). Establezca el indicador "do_not_paint" en falso. Actualizar.

  3. Captura WM_PAINT y mensajes relacionados. Solo llame a base.WndProc() si el indicador "do_not_paint" es falso.

Lo que esto hace es permitir el control desplazable para hacer los cálculos de diseño y sea cual sea el reposicionamiento de la barra de desplazamiento que tiene que hacer, pero no lo deja volver a dibujar cualquier cosa que pudiera desencadenar el efecto de cizallamiento.

15

esto es lo que funcionó para mí.

public class CustomFlowLayoutPanel : FlowLayoutPanel 
{ 
    public CustomFlowLayoutPanel() 
     : base() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    } 

    protected override void OnScroll(ScrollEventArgs se) 
    { 
     this.Invalidate(); 

     base.OnScroll(se); 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x02000000; // WS_CLIPCHILDREN 
      return cp; 
     } 
    } 
} 
+1

Hice esto y funcionó bien, pero también lo hice volver a pintar en el cambio de tamaño, porque por alguna razón no es muy inteligente hacerlo por sí mismo. –

+0

Genial, funciona para mí. ¿Podrías dar más detalles sobre lo que este 'CreateParams' está haciendo en realidad, y cómo diablos lo has encontrado? ¿Lo descubriste tú mismo? –

+0

¡Eres mi héroe! –

1

Es un poco tarde ... pero esto pasa si te metes con Color.Transparent. Comprueba si tu FlowLayoutPanel tiene fondo transparente. Si es así, intenta cambiar eso.

2

Agregué Application.DoEvents() al evento Scroll del FlowPanel amd que detuvo la borrosidad de los controles secundarios FlowPanel que recibía.

+0

Esta es la solución más fácil y simple de la historia. ¡Gracias! –

Cuestiones relacionadas