我在网站和其他网站上看到过这个问题很多,但我还没有找到答案。我要做的是点击一系列大约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);
}
然而,这会使用鼠标创建一个矩形,这在我的情况下不起作用。 简而言之,我需要能够在面板中创建一个矩形,当它到达底部时,它将允许您滚动并添加更多矩形...它听起来不那么难,但我是缺少一些基本的东西,它真的开始研磨我的齿轮!请帮助!
答案 0 :(得分:1)
在Graphics
事件以外的任何地方使用Paint
属性不是一个好习惯。因为你不想丢失你刷新后画的东西,所以你必须在需要时画出它们,即Paint
事件。所以你有两个选择:
首先创建Image
,从图片中获取Graphics
并将项目绘制到该图片,然后将面板的BackGroundImage
属性设置为此图片。这样你就不会乱画并将它交给控件本身:)
第二将绘制矩形所需的数据存储在表单范围内的某些变量中。您可以在每次点击时使用List
Rectangle
和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());
}
如果你使用你提到的滚动技巧,请记住将其包含在子面板中