System.Windows.Forms.ScrollableControl
非常に大きくなる可能性のあるコントロール ( ) があります。カスタムOnPaint
ロジックがあります。そのため、ここで説明する回避策を使用しています。
public class CustomControl : ScrollableControl
{
public CustomControl()
{
this.AutoScrollMinSize = new Size(100000, 500);
this.DoubleBuffered = true;
}
protected override void OnScroll(ScrollEventArgs se)
{
base.OnScroll(se);
this.Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var graphics = e.Graphics;
graphics.Clear(this.BackColor);
...
}
}
ペイント コードは主に、スクロールすると動く「通常の」ものを描画します。描画される各形状の原点は、オフセットされthis.AutoScrollPosition
ます。
graphics.DrawRectangle(pen, 100 + this.AutoScrollPosition.X, ...);
ただし、コントロールには「静的」要素も含まれており、親コントロールに対して常に同じ位置に描画されます。AutoScrollPosition
そのために、私は形状を直接使用して描画しません:
graphics.DrawRectangle(pen, 100, ...);
ユーザーがスクロールすると、Windows は表示領域全体をスクロールと反対の方向に移動します。通常、これは理にかなっています。スクロールがスムーズで応答性が高いように見えるためです (そして、新しい部分のみを再描画する必要があります)。ただし、静的な部分もこの変換の影響を受けます (したがって、this.Invalidate()
のOnScroll
)。次のOnPaint
呼び出しでサーフェスが正常に再描画されるまで、静的部分はわずかにずれています。これにより、スクロール時に非常に顕著な「揺れ」効果が発生します。
静的パーツでこの問題が発生しないスクロール可能なカスタム コントロールを作成する方法はありますか?