【问题标题】:How to keep graphics when resizing C# form调整 C# 窗体大小时如何保留图形
【发布时间】:2012-09-20 00:17:02
【问题描述】:

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

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

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));
}

【问题讨论】:

标签: c#


【解决方案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 形状)。

【讨论】:

  • 你能澄清一下这段代码为什么我应该这样做吗?什么想法?
  • 覆盖 OnPaint 是进行自定义渲染的标准方式。有关更多信息,请参阅此处的官方文档:msdn.microsoft.com/en-us/library/…
【解决方案2】:

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

干杯

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-13
      • 2013-02-05
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      相关资源
      最近更新 更多