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:
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:
Al cambiar el tamaño de la forma (y el panel acoplado, también), corta los bordes cuando se hace más pequeño ...
... o dibuja objetos, cuando se hace más grande:
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();
posible duplicado de http://stackoverflow.com/questions/1970196/c-sharp-panel-backgroundimage-transparent-controls-flickering – ionden