1

我在这个网站和其他网站上看到了很多这样的问题,但我还没有找到答案。我想要做的是在单击时绘制一系列大小约为 10x10 的矩形。所以我有一个按钮,当我点击它时,它会在我的面板内创建一个矩形

 xgraphics = pnlContainer.CreateGraphics();
 xgraphics.FillRectangle(new SolidBrush(Color.Red), xAxis, yAxis, 10, 10);
 pnlContainer.AutoScrollPosition = new Point(Convert.ToInt32(xAxis),Convert.ToInt32(yAxis));
 yAxis += 10;

它创建矩形然后向下移动,在下一次单击时它会创建另一个矩形,但现在它更低,依此类推。我正在使用我在此处阅读的关于如何通过将面板放入带有 autoscoll 的面板内并在到达底部时提高内部面板的高度来滚动面板的技巧。但是效果很好!!!!当面板滚动条出现时,它会清除我所有的图形。

我读到我反对使用 invalidate(); 但是当我这样做时,它会抛出一个错误,即图形无法转换为矩形。所以什么F???

我在 MSDN 上看到我可以这样做:

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{

  // Draw the rectangle...

  e.Graphics.DrawRectangle(new Pen(Color.Blue, PenWidth), RcDraw);

}

但是,这会使用鼠标创建一个矩形,这在我的情况下不起作用。简而言之,我需要能够在面板中创建一个矩形,当它到达底部时,它将允许您滚动并向其添加更多矩形......听起来并不难,但我缺少一些基本的东西,它真的开始磨我的齿轮了!请帮忙!

4

1 回答 1

1

Graphics在事件之外的任何地方使用属性都不是一个好习惯Paint。因为你不想在刷新后丢失你画的东西,所以你必须在需要的时候画它们,这是在Paint事件中。所以你有两个选择:

首先创建一个ImageGraphics从图像中获取并将您的项目绘制到它,然后将BackGroundImage面板的属性设置为此图像。这样您就不会弄乱绘画并将其交给控件本身:)

其次,将绘制矩形所需的数据存储在表单范围内的一些变量中。您可以在每次点击时使用 a Listof Rectangles 和to 它们,然后在需要时Add在事件中绘制它们:Paint

private List<Rectangle> myrects=new List<Rectangle>;

    private void childPanel_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
      e.Graphics.FillRectangles(Brushes.Red, myrects.ToArray());
    }

如果您使用您提到的滚动技巧,请记住将其包含在子面板中

于 2013-08-07T03:35:00.903 回答