【问题标题】:How to draw shapes in panels of windows form?如何在窗体的面板中绘制形状?
【发布时间】:2011-11-29 14:27:54
【问题描述】:

我正在使用面板绘制圆形等形状,但问题是当我更改选项卡或最小化程序然后最大化程序时,所有绘制的东西都会被删除。谁能告诉我是什么原因?

【问题讨论】:

  • 你在画哪个对象的哪个事件?

标签: c# winforms visual-studio-2010


【解决方案1】:

由于您没有发布任何代码,因此您让所有读者都在猜测。我的猜测是您最有可能使用 CreateGraphics,这可能是一个错误。

您的面板的绘制事件应如下所示:

private void panel1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
  e.Graphics.FillEllipse(Brushes.Red, new Rectangle(10, 10, 32, 32));
}

您在绘画活动中完成所有绘画。要强制刷新,只需致电panel1.Invalidate()

如果绘制位图,你可以这样处理:

Bitmap bmp = new Bitmap(500, 500);

private void button1_Click(object sender, EventArgs e) {
  using (Graphics g = Graphics.FromImage(bmp)) {
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.Clear(Color.White);
    g.FillEllipse(Brushes.Red, new Rectangle(10, 10, 32, 32));
  }
  panel1.Invalidate();
}

private void panel1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.DrawImage(bmp, new Point(0, 0));
}

【讨论】:

  • 这是一个很好的答案。令人惊讶的是,即使在 9 年后,它还没有得到更多的支持。
【解决方案2】:

您绘制的任何内容(默认情况下)都不是持久的,并且可能会丢失任何使窗口的一部分无效(将其覆盖并发现、最小化、UAC 提示等)。 为了解决这个问题,您需要记住在Paint 事件中需要绘制和重绘的内容。

【讨论】:

    【解决方案3】:

    原因是控件失效,然后重绘。
    您应该捕获 Paint 事件并在面板内重绘您需要的所有内容。
    每次必须(部分或完全)重绘控件时都会触发此事件。

    用户评论后编辑:
    当您的用户绘制某些东西时,您可以将形状(类型和各种坐标)存储在 List 中,并在 Paint 事件中从上到下重绘列表中包含的所有内容。

    【讨论】:

    • 比如我的程序的用户画了5个圆圈,然后把程序最小化,那么最大化后他还要重新画圆圈吗?
    • 使用公共覆盖 OnPaint(... 您还应该考虑使用缓冲区,例如绘制位图并将其重绘到屏幕上(因此您仅在添加、删除或更改形状时才重绘形状). 此外,您可能需要覆盖 OnPaintBackground 以停止闪烁。
    • @Aqib:简单的答案是肯定的。如果控件无效(因为您将其隐藏或其他控件超过了它)必须重新绘制它并且您所做的一切都必须再次完成!
    【解决方案4】:

    像这样缓冲: (您可以通过在表单加载中强制使用更大的位图来跳过表单调整大小的重绘。)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication10
    {
        public partial class Form1 : Form
        {
            Bitmap bitmap = null;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Redraw();
            }
    
            protected override void OnPaintBackground(PaintEventArgs e)
            {
                OnPaint(e);
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                if (bitmap == null)
                {
                    base.OnPaint(e);
                }
                else
                {
                    e.Graphics.DrawImageUnscaled(bitmap, 0, 0);
                }
            }
    
            private void Form1_Resize(object sender, EventArgs e)
            {
                Redraw();
            }
    
            private void Form1_ResizeEnd(object sender, EventArgs e)
            {
                Redraw();
                this.Invalidate();
            }
    
            private void Redraw()
            {
                if (bitmap != null)
                {
                    bitmap.Dispose();
                    bitmap = null;
                }
                bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.Clear(Color.White);
                    // This is where you could use a List<Shape> etc...
                    g.DrawEllipse(Pens.Black, new Rectangle(10, 10, 20, 20));
                    g.DrawEllipse(Pens.Black, new Rectangle(20, 30, 20, 20));
                    g.DrawEllipse(Pens.Black, new Rectangle(50, 90, 30, 20));
                }
    
            }
    
    
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多