スクロール時に多数の一番上の行が所定の位置にとどまるコントロールのようなテーブルを作成したいと思います。OnPaint メソッドのオーバーライドでコントロールをペイントします。
スクロールすると、部分的な再描画が自動的に行われますが、これによりアーティファクトが作成され、奇妙に見えます。それを解決するために、Invalidate(); を呼び出します。または Refresh(); スクロールイベントにアタッチされたイベントハンドラーで、スクロールイン/ビューアウトするはずの部分をペイントするときにスクロール位置を考慮に入れます。ただし、これを行うと、所定の位置に留まるはずの部分がスクロールアウトされ、何度も送り返されます。(ちらつきのようなものです)ちらつきなしでスムーズに動作するようにしています。
問題を単純化するために、スクロール時に所定の位置に留まるはずの線を描く次のコードを作成しました。ご覧のとおり、スクロールするとちらつき始めます。
コードでわかるように、ダブルバッファリングなどについてはすでに考えています。
ラインを固定する方法を知っている人はいますか?前もって感謝します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace ColumnReaderUITryOut
{
public partial class CustomPaintScrollTest : UserControl
{
public CustomPaintScrollTest()
{
InitializeComponent();
AutoScrollMinSize = new Size(500, 600);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawLine(Pens.Black, 0, 0, Width, Height);
}
private void CustomPaintScrollTest_Scroll(object sender, ScrollEventArgs e)
{
Invalidate();
}
}
}