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

时间:2011-11-29 14:27:54

标签: c# winforms visual-studio-2010

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

        }



    }
}