CF でペイントするときのちらつきとガベージの作成を防ぐためのヒント:
- OnPaintBackground をオーバーライドして空のままにします
Graphics
複数の操作がある場合は、手渡されたものに直接描画しないでください。代わりに、Bitmap
バッファを作成し、そこに描画してから、そのビットマップの内容をGraphics
- すべてのペイントで上記の #2 のバッファを作成しないでください。1 つ作成して再利用します。
- 静的項目 (署名コントロールのボックスなど) を再描画しないでください。代わりに、バッファリングされた に一度描画し、
Bitmap
そのビットマップを #2 のバッファにペイントしてから、動的アイテムをペイントします。
- すべてのペイントでペン、ブラシなどを作成しないでください。バッファリングして再利用します。
あなたの場合、これらの推奨事項は次のようになります。
class Foo : Form
{
private Bitmap m_background;
private Bitmap m_backBuffer;
private Brush m_blackBrush;
private Pen m_blackPen;
public Foo()
{
m_blackBrush = new SolidBrush(Color.Black);
m_blackPen = new Pen(Color.Black, 2);
// redo all of this on Resize as well
m_backBuffer = new Bitmap(this.Width, this.Height);
m_background = new Bitmap(this.Width, this.Height);
using (var g = Graphics.FromImage(m_background))
{
// draw in a static background here
g.DrawRectangle(m_blackBrush, ...);
// etc.
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
using (var g = Graphics.FromImage(m_backBuffer))
{
// use appropriate back color
// only necessary if the m_background doesn't fill the entire image
g.Clear(Color.White);
// draw in the static background
g.DrawImage(m_background, 0, 0);
// draw in dynamic items here
g.DrawLine(m_blackPen, ...);
}
e.Graphics.DrawImage(m_backBuffer, 0, 0);
}
}