En Windows Forms, la propiedad DoubleBuffered no afecta a los controles secundarios, como los cuadros de texto. En cambio, afecta solo la forma o el Panel para el que está configurado.
Si desea duplicar el almacenamiento en búfer para los elementos secundarios en un formulario, deberá implementar el doble almacenamiento en el buffer manual.
Bob Powell ha escrito good article (y otros) sobre cómo hacer esto.
También, a partir de una forum answer Bob también dice:
La propiedad de una ventana significa que van a parpadear sin control porque no se puede hacer doble búfer fuera del área de ventanas de destino. Un panel con controles secundarios no puede ser hecho para duplicar el propio buffer y es hijos por ejemplo.
La única manera de hacer esto correctamente es para crear un único control que hace todo el dibujo mediante una forma de sistema de modo de gráficos conservado.
Por lo tanto, para obtener el parpadeo de texto libre de cambiar el tamaño utilizando el doble buffer manual de lo que se necesita para hacer de alguna manera el cuadro de texto a su memoria intermedia hacia atrás y luego mostrarlo como parte de la actualización tamponada. Si es posible, no espero que esto sea fácil.
[Actualización]
Algunas otras respuestas han dicho que este es un problema con Windows Forms específicamente. Esto no es correcto, en realidad es más profundo que eso y es causado por Windows GDI. Como ejemplo, abra el Bloc de notas/Wordpad, etc. y pegue una gran cantidad de texto, cambie el tamaño de la ventana y observe el mismo problema de parpadeo.
Aquí hay una solución básica que utilicé hace años para hacer algo similar. Es un formulario simple que contiene un cuadro de texto multilínea y una clase personalizada que hereda del Panel. Ambos controles tienen la misma ubicación y tamaño. Utiliza las formas ResizeBegin y ResizeEnd para mostrar el panel al redimensionar, y el cuadro de texto de lo contrario. No es perfecto pero elimina el parpadeo.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Bitmap bm = null;
private void textBox1_Resize(object sender, EventArgs e)
{
Graphics g = textBox1.CreateGraphics();
if (g.VisibleClipBounds.IsEmpty == false)
{
bm = new Bitmap((int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height);
textBox1.DrawToBitmap(bm, new Rectangle(0, 0, (int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height));
}
g.Dispose();
}
private void panelDB1_Paint(object sender, PaintEventArgs e)
{
if (bm != null)
{
e.Graphics.DrawImageUnscaled(bm, 0, 0,bm.Width,bm.Height);
}
}
private void Form1_ResizeBegin(object sender, EventArgs e)
{
panelDB1.BringToFront();
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
panelDB1.SendToBack();
}
}
class PanelDB : Panel
{
public PanelDB()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer,true);
//this.DoubleBuffered = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
}
}
Publicación interesante, tengo problemas similares con el control de una etiqueta, pero sobre la base de que leo DoubleBuffer solo debe establecerse con AllPaintInWmPaint, que solo se debe establecer con UserPaint, no lo guardé doblemente ... – Ian
@romkyns, he actualizado mis ans wer con una solución que he usado en el pasado. – Ash