2

スクロール時に多数の一番上の行が所定の位置にとどまるコントロールのようなテーブルを作成したいと思います。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();
        }
    }
}
4

0 に答える 0