Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 滚动带有自定义绘制控件的面板_C#_Winforms_Custom Controls_Draw - Fatal编程技术网

C# 滚动带有自定义绘制控件的面板

C# 滚动带有自定义绘制控件的面板,c#,winforms,custom-controls,draw,C#,Winforms,Custom Controls,Draw,我有一个面板,其中包含一组自定义绘制的控件。我知道如何编程滚动面板,但问题是滚动时控件如何绘制。向右滚动时,控件显示为正常,但向左滚动时,控件显示不正确。这只是完整应用程序的开始,所以我现在有一些基本的测试。需要找到一种方法使控件在滚动时正确绘制 表格编号: public partial class Form1 : Form { Panel pn; private int location = 0; public Form1() { Initial

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

表格编号:

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();
        }
    }
}

不要剪辑您的图形:

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

还忘了提到向左滚动是“A”,向右滚动是“D”
,但向左滚动时,它看起来不正确
什么样子不正确?它通过显示控件上下一个控件将控件一分为二。我想让它显示面板的边缘。这很难解释,除非你测试代码并亲自查看,我确实测试过。我怎么知道你在努力实现什么?你没有把这个放在你的问题里,只是加了一张图片来说明我的意思
//Rectangle rc = new Rectangle(pe.ClipRectangle.X, pe.ClipRectangle.Y, 100, 100);
Rectangle rc = new Rectangle(0, 0, 100, 100);