Windows フォームでは、DoubleBuffered プロパティはテキスト ボックスなどの子コントロールには影響しません。代わりに、設定されているフォームまたはパネルだけに影響します。
フォームの子要素のダブル バッファリングが必要な場合は、手動のダブル バッファリングを実装する必要があります。
Bob Powell は、これを行う方法について優れた記事(および他の記事) を書いています。
また、フォーラムの回答から、ボブも次のように述べています。
ウィンドウの所有権は、ターゲット ウィンドウ領域の外側でダブル バッファリングできないため、ウィンドウが制御不能にちらつくことを意味します。子コントロールを持つパネルは、それ自体をダブル バッファにすることはできません
。たとえば、それは子です。
これを正しく行う唯一の方法は、保持モード グラフィックス システムの形式を使用してすべての描画を行う単一のコントロールを作成することです。
したがって、手動のダブルバッファリングを使用してちらつきのないテキストボックスのサイズを変更するには、何らかの方法でテキストボックスをバック バッファにレンダリングしてから、バッファリングされた更新の一部として表示する必要があります。可能であれば:これが簡単になるとは思いません。
[アップデート]
他のいくつかの回答では、これは特に Windows フォームの問題であると述べています。これは正しくありません。実際にはそれよりも深く、Windows GDI が原因です。例として、メモ帳/ワードパッドなどを開いて大量のテキストを貼り付け、ウィンドウのサイズを変更すると、同じちらつきの問題が発生します。
これは、私が何年も前に同様のことを行うために使用した基本的なソリューションです。これは、複数行のテキスト ボックスと、Panel から継承したカスタム クラスを含む単純なフォームです。両方のコントロールの位置とサイズは同じです。フォームの ResizeBegin と ResizeEnd を使用して、サイズ変更時にパネルを表示し、それ以外の場合はテキスト ボックスを表示します。完全ではありませんが、ちらつきはなくなります。
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);
}
}