2012-03-17 22 views
7

Actualmente estoy tratando de hacer lo que pensé que sería una tarea sencilla:una imagen en un control Panel da artefactos al cambiar el tamaño

dibujar una imagen sobre el área completa de un Panel control en Windows Forms. (Por favor, ignora por el momento que podría utilizar el BackgroundImage property)

La imagen para dibujar el siguiente aspecto:

enter image description here

es decir, una caja amarilla con un marco azul de 1 píxel alrededor.

Para dibujar, estoy usando el evento Paint del control Panel:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle); 
} 

Esto se ve bien cuando se muestra inicialmente la forma:

enter image description here

Al cambiar el tamaño de la forma (y el panel acoplado, también), corta los bordes cuando se hace más pequeño ...

enter image description here

... o dibuja objetos, cuando se hace más grande:

enter image description here

Estoy bastante seguro de que no va en algo bastante simple y directo, pero realmente no puedo entender la razón.

Como ignoro el ClipRectangle y siempre dibujo todo, pensé que la imagen se escalaría todo el tiempo.

Mis preguntas son:

  • ¿Cuál es la razón de los artefactos? (I amor para entender esto!)
  • ¿Qué debo hacer para deshacerme de los artefactos? (Al lado de llamar Invalidate en cada cambio de tamaño)

actualización, SOLUCIÓN:

Gracias a Ryan's answer, yo era capaz de encontrar una solución aceptable. Básicamente obtuve una clase de Panel, hice una anulación de OnPaintBackground e hice no llamo al método base. Por último, he añadido el código siguiente al constructor de mi panel de derivados:

base.DoubleBuffered = true; 

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

UpdateStyles(); 
+1

posible duplicado de http://stackoverflow.com/questions/1970196/c-sharp-panel-backgroundimage-transparent-controls-flickering – ionden

Respuesta

4

La razón de los artefactos es que toda la superficie no se vuelve a dibujar cuando se cambia el tamaño del formulario; solo las partes necesarias son La mejor solución generalmente es lo que no desea hacer, llamando al Invalidate en cada cambio de tamaño. Sin embargo, si esta es su situación, use un PictureBox.Si no es así, puede considerar anular OnPaint en su formulario y usar this.SetStyle(ControlStyles.ResizeRedraw, true) para hacerlo automáticamente.

+0

¿Alguna posibilidad de reducir el parpadeo al llamar a 'Invalidar'? (Creo que esto proviene del fondo que se dibuja primero) ¿Tal vez girando el dibujo/relleno de fondo? –

+2

@UweKeim: deberá habilitar el doble almacenamiento en el búfer; subclase 'Panel', use' OnPaint' en lugar de manejar 'Paint', y establezca la propiedad' DoubleBuffered' en 'true'. – Ryan

Cuestiones relacionadas