Problem z efektywnym rysowaniem!

0

Witam wszystkich! :-)

Mam następujący problem. Tworzę aplikację do rysowania prostych figur geometrycznych z możliwością ich przesuwania. Figury te rysuję na formie pictureBox1. Do narysowania np. prostokąta używam następującego kodu:

    public partial class ClsDrawRect : Form
    {
        Point p1 = Point.Empty;
        Point rectPos = new Point(100, 100);

        public Form1()
        {
            InitializeComponent();

            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            using (Graphics g = Graphics.FromImage(pictureBox1.Image))
            {
                g.DrawRectangle(Pens.Black, rectPos.X, rectPos.Y, 100, 100);
            }
        }

        void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                using (Graphics g = Graphics.FromImage(pictureBox1.Image))
                {
                    rectPos.X += e.X - p1.X;
                    rectPos.Y += e.Y - p1.Y;
                    g.DrawRectangle(Pens.Black, rectPos.X, rectPos.Y, 100, 100);
                }
                p1 = e.Location;
            }

        }

        void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                p1 = e.Location;
        }
    }

Za pomocą tego kodu rysuję i przesuwam narysowany prostokąt. Niestety w momencie gdy wymiar pictureBox1 jest stosunkowo duży aplikacja zaczyna ‘zamulać’. Jest to pewnie związane z rozmiarem Bitmapy.. ma ktoś pomysł jak temu zaradzić? [???]

Z góry dziękuję za pomoc! :-)

Pozdrawiam.

Rafał (bakłażan)

Wiem, że można rysować również rysować na formie panel, ale forma ta nie zachowuje grafiki w momencie gdy aplikacja jest np. minimalizowana..

0

Za kazdym razem tworzysz nowa bitmape. Rysuj caly czas na tej samej, tylko czysc za kazdym razem. Ew. stworz dwie i rysuj naprzemian - na zasadzie:

  1. Pokazana jest pierwsza
  2. Rysujesz na drugiej
  3. Podmieniasz bitmapy - w sensie podstawiasz pod pictureboxa ta pierwsza

To cos w stylu imitacji double buffering - nie wiem czy sie nie da po prostu tego wlaczyc...

0

Faktycznie wystarczy zmienić kod nieznacznie i aplikacja chodzi znacznie szybciej! :-) O to chodziło!

Dziękuję za pomoc! :-)

    public partial class ClsDrawRect : Form
    {
        Point p1 = Point.Empty;
        Point rectPos = new Point(100, 100);

        public Form1()
        {
            InitializeComponent();

            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            using (Graphics g = Graphics.FromImage(pictureBox1.Image))
            {
                g.DrawRectangle(Pens.Black, rectPos.X, rectPos.Y, 100, 100);
            }
        }

        void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                //-----------------------------
                //Ten fragment usuwamy!!!
                //-----------------------------
                //pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                using (Graphics g = Graphics.FromImage(pictureBox1.Image))
                {
                    rectPos.X += e.X - p1.X;
                    rectPos.Y += e.Y - p1.Y;
                    g.DrawRectangle(Pens.Black, rectPos.X, rectPos.Y, 100, 100);
                }
                p1 = e.Location;
                //------------------------------
                //Ten fragment dodajemy!!!
                //------------------------------
                pictureBox1.Refresh();
            }

        }

        void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                p1 = e.Location;
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1