在面板中滚动形状

本文关键字:滚动 | 更新日期: 2023-09-27 18:07:55

我正在编写一个在面板上绘制形状的程序。我在面板上添加了一个垂直滚动条,但是当滚动面板时,形状保持在原来的位置,不滚动。如何让这些形状滚动?
我在paint handler中使用以下代码来更新这些形状:

e.Graphics.FillRectangle(Brushes.Red, selectedRect);

在面板中滚动形状

在滚动时,您应该注意面板的实际滚动位置,并在再次绘制形状时考虑此偏移量。

网上有这样的例子(不完全是你的情况,但可以帮助识别问题):

private int count; 
private ArrayList arrayctl = new ArrayList();
private void button1_Click(object sender, System.EventArgs e) 
{ 
    TextBox newtxt = new TextBox(); 
    newtxt.Text = count.ToString(); 
    count++; arrayctl.Add(newtxt); 
    DrawControls(); 
} 
private void DrawControls() 
{ 
    System.Drawing.Point CurrentPoint; CurrentPoint = panel1.AutoScrollPosition; 
    int i = 0; 
    panel1.Controls.Clear(); 
    panel1.SuspendLayout(); 
    foreach (TextBox txt in arrayctl) 
    {
     panel1.Controls.Add(txt); 
        txt.Width = panel1.ClientRectangle.Width; 
        txt.Top = i; i += txt.Height; 
    } 
    panel1.ResumeLayout(); 
    panel1.AutoScrollPosition = new Point(Math.Abs(panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y)); 
}

我也发现了这个在这里:控制位置在Windows.Forms.Panel与自动滚动

不要在面板中添加垂直滚动条。当你设置AutoScrollMinSize属性时,面板已经处理自己的滚动:

Rectangle selectedRect = new Rectangle(16, 16, 64, 28);
private void Form1_Load(object sender, EventArgs e)
{
  panel1.AutoScrollMinSize = new Size(panel1.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth, 1200);
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
  e.Graphics.TranslateTransform(panel1.AutoScrollPosition.X, panel1.AutoScrollPosition.Y);
  e.Graphics.FillRectangle(Brushes.Red, selectedRect);
}
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
  panel1.Invalidate();
}