0

我正在开发一个程序,当我单击表单时,我需要在表单本身上绘制矩形图形。我创建了代码来执行此操作(如下),但是当我调整表单大小时,矩形被删除。

调整表单大小时如何保留绘制的矩形?

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Pen Haitham = new Pen(Color.Silver, 2);
    g.FillRectangle(Haitham.Brush, new Rectangle(e.X, e.Y, 50, 50));
}
4

3 回答 3

1

你可以这样做:

    private List<Point> _points = new List<Point>();

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        foreach(Point point in _points)
        {
            using (Pen Haitham = new Pen(Color.Silver, 2))
            {
                e.Graphics.FillRectangle(Haitham.Brush, new Rectangle(point.X, point.Y, 50, 50));
            }
        }
    }

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        _points.Add(new Point(e.X, e.Y));
        Invalidate(); // could be optimized to invalidate only the future rectangle draw
    }

在带有 Winforms(或本机 Windows)的 Windows 中,您应该覆盖 OnPaint 并在那里执行几乎所有的绘制逻辑。

请注意,使用 WPF 会有所不同,您将组成一个场景,向其中添加元素(例如,在这里您将向 Canvas 添加一个 Rectangle 形状)。

于 2012-09-19T15:08:57.267 回答
1

你必须做事件"Graphics"中的"Paint"事情。然后您可以始终看到您的矩形,因为只要窗口需要使绘画无效,就会触发该事件。

干杯

于 2012-09-19T15:10:54.590 回答
0

我对图形不太熟悉,但我假设您需要将所有绘图对象放入一个容器中,并在调整表单大小时重新绘制它们。您可能需要在 sizeChanged 事件中调用所有正在绘制的对象。

于 2012-09-19T15:12:07.047 回答