Как нарисовать фигуры в панелях оконных форм? - PullRequest
0 голосов
/ 29 ноября 2011

Я использую панель для рисования фигур, подобных кругу, но проблема в том, что когда я изменяю вкладку или минимизирую программу, а затем максимизирую программу, все нарисованные элементы удаляются. Кто-нибудь может сказать мне, в чем причина?

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Так как вы не опубликовали код, вы оставляете все ваши читатели в догадках. Я предполагаю, что вы, скорее всего, используете 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));
}
0 голосов
/ 29 ноября 2011

Буферизация так: (Вы можете пропустить перерисовку при изменении размера формы, принудительно увеличив растровое изображение при загрузке формы.)

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

        }



    }
}
0 голосов
/ 29 ноября 2011

Все, что вы рисуете, (по умолчанию) не является постоянным и может потеряться из-за любого недействительного элемента окна (скрыть его и раскрыть, свернуть, запрос UAC и т. Д.). Чтобы обойти это, вам нужно вспомнить, что нужно рисовать, и перерисовать это в событии Paint.

0 голосов
/ 29 ноября 2011

Причина в том, что элемент управления недействителен, а затем перерисован.
Вы должны перехватить событие Paint и перерисовать все, что вам нужно внутри панели.
Это событие вызывается каждый раз, когда должен быть элемент управления (частично или полностью).) redrawn.

ИЗМЕНЕНО после комментария пользователя:
Когда ваш пользователь что-то рисует, вы можете сохранить фигуру (тип и различные координаты) в List и, на Paint событие, перерисовать все содержащиеся в списке сверху вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...