如何在窗体面板中绘制形状?

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

由于您没有发布任何代码,因此您的所有读者都会猜测。 我的猜测是你最有可能使用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)); } 

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

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

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

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

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