Windows.Forms --> funkcja DrawEllipse i rzucany wyjątek

0

Bardzo proszę o pomoc w rozwiązaniu mojego problemu. Wujek Google niestety nie dał rady, a ja już nie mam pomysłów.

Piszę program za pomocą WindowsForms, który ma mieć możliwość rysowania różnych elementów w PictureBox'ie.

Stworzyłem klasę MyPictureBox która dziedziczy po PictureBox'ie i wygląda tak:

    class MyPictureBox : PictureBox
    {
        Bitmap bmp;
        Graphics g;

        public MyPictureBox()
        {
            bmp = new Bitmap(this.Width, this.Height);
            g = Graphics.FromImage(bmp);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Pen pen1 = new Pen(Color.Green, 2.0f);
            g.DrawEllipse(pen1, 20, 20, 400, 400);

            this.Image = bmp;
            this.Invalidate();          // odświeżanie PictureBox'a
            g.Dispose();                // uwolnienie Graphics
        }
    }

Oprócz pliku z tą klasą, mój projekt zawiera pliki:

  • plik główny formatki czyli Form1.cs - tutaj nic jeszcze nie wpisałem.
  • plik designera formatki czyli Form1.Designer.cs - tutaj dodałem inicjalizację oraz ułożenie PictureBox'a na formatce.

Po uruchomieniu programu, PictureBox pojawia się na formatce, ale po króciutkiej chwili zostaje rzucony wyjątek "Parametr jest nieprawidłowy" w linii:

g.DrawEllipse(pen1, 20, 20, 400, 400);

Szukam w Google'ach, kombinuję i za Chiny nie mogę zczaić dlaczego rzucony jest ten wyjątek. Będę bardzo wdzięczny za pilną pomoc!

0

g.Dispose();
No i po czym wtedy ma Ci rysować :)?
usuwasz sobie powierzchnie po ktorej rysujesz

0

No racja!! Wielkie dzięki!! :) Tak to jest, że czasem jak się ślęczy kilka godzin nad paroma linijkami kodu, to człowiek głupieje i nie zauważa istotnych szczegółów.

PS: Ta funkcja Dispose() to jeszcze przyzwyczajenie po jednym tutorialu, ale w przypadku mojego programu, faktycznie nie jest potrzebna ;)

1

Domyślam się że już wiesz, ale jeszcze napiszę - Graphics (i inne niezarządzane) zawsze zwalniamy, ale NIE MOŻEMY tego zrobić z obiektami graphics które otrzymaliśmy.

0

Domyślam się że już wiesz, ale jeszcze napiszę - Graphics (i inne niezarządzane) zawsze zwalniamy, ale NIE MOŻEMY tego zrobić z obiektami graphics które otrzymaliśmy.

Powiedziałbym "z obiektami, które jeszcze chcemy użyć " :)

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