使用自定义绘制的控件滚动面板

scrolling a panel with custom drawn controls

我有一个面板,其中包含一组自定义绘制的控件。我知道如何以编程方式滚动面板,但问题是控件在滚动时如何绘制。向右滚动时控件显示正常,但向左滚动时它看起来不正确。这只是完整应用程序的开始,所以我现在只进行了一些基本测试。需要想办法让控件在滚动时正确绘制。

表单代码:

public partial class Form1 : Form
{
    Panel pn;
    private int location = 0;
    public Form1()
    {
        InitializeComponent();
        pn = new Panel()
        {
            Width = this.ClientRectangle.Width - 20,
            Height = 120,
            BackColor = Color.Black,
            Left = 5,
            Top = 20
        };
        pn.AutoScroll = false;
        pn.VerticalScroll.Maximum = 100;
        pn.HorizontalScroll.Maximum = this.ClientRectangle.Width - 100;
        pn.VerticalScroll.Visible = false;
        pn.HorizontalScroll.Visible = false;
        pn.AutoScrollPosition = new Point(0, 0);
        pn.AutoScroll = true;
        this.KeyPreview = true;
        this.KeyDown += new KeyEventHandler(keyPress);
        for(int i = 0; i<10;i++)
        {
            CustomControl1 cc = null;
            if (i % 2 != 0)
                cc = new CustomControl1()
                {
                    isOdd = true,
                    Width = 100,
                    Height = 100,
                    Left = (100*i)+5,
                    Top = 0
                };
            else
                cc = new CustomControl1()
                {
                    isOdd = false,
                    Width = 100,
                    Height = 100,
                    Left = (100 * i) + 5,
                    Top = 0
                };
            pn.Controls.Add(cc);
        }
        this.Controls.Add(pn);
    }
    private void keyPress(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.A:
                if(location - 20 >0)
                {
                    location -= 20;
                    pn.HorizontalScroll.Value = location;
                }
                else
                {
                    location = 0;
                    pn.AutoScrollPosition = new Point(location, 0);
                }
                break;
            case Keys.D:
                if(location +20 < pn.HorizontalScroll.Maximum)
                {
                    location += 20;
                    pn.HorizontalScroll.Value = location;
                }
                else
                {
                    location = pn.VerticalScroll.Maximum;
                    pn.AutoScrollPosition = new Point(location, 0);
                }
                break;
        }
        foreach(Control c in pn.Controls)
        {
            c.Invalidate();
        }
    }
}

控制代码:

public partial class CustomControl1 : Control
{
    public bool isOdd { get; set; }
    public CustomControl1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        Graphics gr = pe.Graphics;
        Rectangle rc = new Rectangle(pe.ClipRectangle.X,pe.ClipRectangle.Y,100,100);
        Brush br = new SolidBrush(Color.Red);
        if (isOdd)
            br = new SolidBrush(Color.Yellow);
        gr.FillEllipse(br, rc);
        base.OnPaint(pe);
    }
    protected override void OnPaintBackground(PaintEventArgs pe)
    {
        base.OnPaintBackground(pe);
    }
}

不要剪辑你的画:

//Rectangle rc = new Rectangle(pe.ClipRectangle.X, pe.ClipRectangle.Y, 100, 100);
Rectangle rc = new Rectangle(0, 0, 100, 100);