在面板内绘图

时间:2013-08-07 02:02:49

标签: c# winforms graphics panels

我在网站和其他网站上看到过这个问题很多,但我还没有找到答案。我要做的是点击一系列大约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);

}

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

1 个答案:

答案 0 :(得分:1)

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

首先创建Image,从图片中获取Graphics并将项目绘制到该图片,然后将面板的BackGroundImage属性设置为此图片。这样你就不会乱画并将它交给控件本身:)

第二将绘制矩形所需的数据存储在表单范围内的某些变量中。您可以在每次点击时使用List RectangleAdd,然后在需要时在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());
    }

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