Для этого вам нужно создать подкласс Panel, потому что вам нужно переопределить определенные вещи. A Panel
, как это должно работать:
class DoubleBufferedPanel : Panel {
public DoubleBufferedPanel() : base() {
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffered |
ControlStyles.Opaque |
ControlStyles.OptimizedDoubleBuffer, true);
}
public override void OnPaint(PaintEventArgs e) {
// Do your painting *here* instead, and don't call the base method.
}
// Override OnMouseMove, etc. here as well.
}
Однако вам не нужна функциональность, которую Panel
добавляет к Control
, то есть для того, чтобы она функционировала как контейнер. Так что, на самом деле, вы должны наследовать от Control
, если вам не нужны субконтроли.
Еще одним улучшением может быть только Invalidate
с Rectangle
, который изменился. Это перекрасит одну область и сократит время рисования. Вы также можете передать srcRect
в Graphics.DrawImage
, при этом srcRect
рассчитывается из e.ClipRectangle
, для еще большей производительности, если подкласс Panel
не работает для вас.