使用autoscroll c#windows窗体修复自定义绘制的usercontrol中的部分

时间:2012-10-29 20:55:12

标签: c# winforms scroll custom-controls autoscroll

我想创建一个像控件一样的表,滚动时会有许多顶行保留在原位。 我在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();
        }
    }
}

0 个答案:

没有答案