Paint. Problem z rysowaniem figur

0

Witam serdecznie, mam problem nad którym siedzę od paru dni.

Mianowicie mam taki kawałek kodu:

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            mouseMoveLocation = e.Location;

            if (rysowanie)
            {
                mouseX = e.X;
                mouseY = e.Y;
            }

            if (e.Button == MouseButtons.Left)
            {
                pisak = new Pen(paletaKolorow.dajColorG(), szerokosc);

                switch (paletaNarzedzi.dajNarzedzie())
                {
                    case "Olowek":
                        {
                            mousePath.AddLine(mouseX, mouseY, mouseX, mouseY);
                            try
                            {
                                grafika.DrawPath(pisak, mousePath);
                            }
                            catch { }
                            pictureBox1.Refresh();
                            break;
                        }
                    case "Prostokat":
                        {

                            grafika.DrawRectangle(pisak, mouseDownLocation.X, mouseDownLocation.Y,
                                mouseX - mouseDownLocation.X, mouseY - mouseDownLocation.Y);
                            pictureBox1.Refresh();
                            break;
                        }
                    case "Elipsa":
                        {
                            grafika.DrawEllipse(pisak, mouseDownLocation.X, mouseDownLocation.Y,
                                mouseX - mouseDownLocation.X, mouseY - mouseDownLocation.Y);
                            pictureBox1.Refresh();
                            break;
                        }
                    default: break;
                }
            }

problem polega na tym, że jeśli rysuję ołówkiem to wszystko jest ok, natomiast jeśli chcę narysować prostokąt bądź elipsę pojawia się problem, który pokazany jest na obrazku

http://img519.imageshack.us/my.php?image=rysin9.jpg

Moje przemyślenia co do tego.

Napisałem ten program wcześniej bez obsługi zapisu obrazka do pliku i problem nie występował, gdyż rysowałem bezpośrednio na obiekcie PictureBox.
Niestety, program musi posiadać zapis do pliku, więc w takim przypadku należy rysować na Bitmapie, a nie bezpośrednio na komponencie.

Po prostu chodzi mi o kawałek kodu, który nie odrysowywałby bitmapy od razu po ruszeniu myszką tylko kiedy nacisnę klawisz myszki i w miejscu w którym go puszczam.

Jeśli napiszę funkcję która rysuje w zdarzeniu OnMouseUp to prostokąt będzie narysowany poprawnie, z tym że nie będzie widoczny sam proces rysowania.

Zastanawiam się czy w ogóle da się to wykonać...

0

Wydaje mi się, że najlepszym sposobem będzie przechowywanie w oddzielnym miejscu już narysowanych elementów i przywracać je podczas rysowania. Coś jak tutaj (dodaj sobie w designerze PictureBox o nazwie pictureBox):

namespace paint
{
    public partial class Form1 : Form
    {
        Image savedState;
        Point startPosition;
        bool drawing;
        Pen pen;

        public Form1()
        {
            InitializeComponent();

            pen = Pens.Black;

            pictureBox.Image = new Bitmap(200, 200);
            savedState = new Bitmap(pictureBox.Image);
            pictureBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
            pictureBox.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
            pictureBox.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
        }

        void pictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            if (drawing)
            {
                pictureBox.Image = (Image)savedState.Clone();
                Graphics g = Graphics.FromImage(pictureBox.Image);
                g.DrawEllipse(pen, startPosition.X, startPosition.Y, e.X - startPosition.X, e.Y - startPosition.Y);
                
                pictureBox.Refresh();
            }
        }

        void pictureBox_MouseUp(object sender, MouseEventArgs e)
        {
            if (drawing)
            {
                Graphics g = Graphics.FromImage(savedState);
                g.DrawEllipse(pen, startPosition.X, startPosition.Y, e.X - startPosition.X, e.Y - startPosition.Y);
                
                g.Save();
                pictureBox.Image = savedState;

                drawing = false;
            }
        }

        void pictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (drawing && e.Button == MouseButtons.Right)
            {
                drawing = false;
                pictureBox.Image = savedState;
            }

            if (e.Button == MouseButtons.Left)
            {
                drawing = true;
                startPosition = e.Location;
            }
        }


    }
}
0

nad czymś takim myślałem, tylko nie potrafiłem tego zaimplementować.

Wielkie dzięki Ci dobry człowieku :)

0

Czy możecie wyświetlić cały kod?

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