none
Elipsa ve Form

    Dotaz

  • Prosím mohl by mi někdo poradit jak vykreslit více přesně definovaných elips? Tak aby se vykreslily postupně?

     

    
    
    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 projekt1._2
    {
      public partial class Form1 : Form
      {
        Graphics g; //Graphics g = e.Graphics; When we use it maybe we must move it down - below setting a parameter e.
        public Form1()
        {
          InitializeComponent();
          g = this.CreateGraphics();
        }
        private int RandomNumber(int min, int max)
        {
          Random random = new Random();
          return random.Next(min, max);
        }
        private void button1_Click(object sender, EventArgs e)
        {
    
          int i = RandomNumber(1, 6);
          switch (i)
          {
            case 1:
              //OnPaint(); Jaky parametr vlozit? Metoda prijima tento parametr PaintEventArgs e, ale kde jej vzit?
              Body();
              break;
            case 2:
              this.Head();
              break;
            case 3:
              break;
            case 4:
              break;
            case 5:
              break;
            case 6:
              break;
          }
          label1.Text = i.ToString();
    
        }
        public void Body()
        {
          g.DrawEllipse(new Pen(Brushes.Black), 160, 200, 100, 200);
          g.Dispose();//elipsa se sice vykresli ale pri opakovanem vykresleni mi program spadne. Jak muzu vykreslit postupne vice tvaru?
        }
        public void Head()
        {
          g.DrawEllipse(new Pen(Brushes.Black), 160, 160, 20, 10);
          g.Dispose();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
          g = e.Graphics;
        }
      }
    }
    //I can try to use method PictureBox, but it's prefered for bitmaped image.

     

    Účelem tohoto programu je po hození kostkou vykreslit adekvátní tvar (např: elipsu, čáru, apod.) v předem přesně definovaných rozměrech a lokalitě.

    Problém je, ale v tom, že nevím jak vykreslit více obrazců postupně.

    Když používám volání téhle metody: g.Dispose(); tak mi to sice vykreslí požadovaný tvar, ale při druhém zavolání program spadne.

    Nejspíš bych měla používat nějaký panel pro kreslení. Možná OnPaint. Tam, ale nevím, ve kterém kroku jej mám zavolat. A kde mám vzít jeho parametr "PaintEventArgs e".

    Nebo bylo by lepší použít jiný panel?

    Budu vděčná za všechny rady případně typy kde najít odpovědi.

    sobota 24. dubna 2010 13:52

Odpovědi

  • Dobrý deň,

    ja by som to riešil nasledovne (s použitím komponenty Panel), vytvoriť triedu, ktorá bude ukladať informácie o útvare, po stlačení tlačidla nastaviť nejakú (čiže náš vybraný útvar) inštanciu triedy Utvar. Invalidate je potrebné zavolať na prekreslenie panela.:

    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace PaintTest
    {
     public partial class Form1 : Form
     {
      public Form1()
      {
       InitializeComponent();
      }
    
      public class Utvar
      {
       public enum TypUtvaru
    	  {
    	   Kruh,
         Obdlznik
    	  }
    
       public TypUtvaru Typ { get; set; }
       public Rectangle Pozicia { get; set; }
       public Brush Farba { get; set; }
    
       public Utvar(TypUtvaru typ, Rectangle pozicia, Brush farba)
       {
        this.Typ = typ;
        this.Pozicia = pozicia;
        this.Farba = farba;
       }
      }
    
      //Tu bude ulozeny utvar, ktory ma byt vykresleny
      //ak je null tak nebude zobrazeny
      Utvar aktualnyUtvar = null;
    
      //Tu mozu byt predefinovane utvary
      Utvar obdlznik1 = new Utvar(Utvar.TypUtvaru.Obdlznik, new Rectangle(5, 0, 20, 20), Brushes.Black);
    
      private void panel1_Paint(object sender, PaintEventArgs e)
      {
       //Pozadie panela biele (vykresli vyplneny obdlznik)
       e.Graphics.FillRectangle(Brushes.White, e.ClipRectangle);
    
       //Ak je priradeny utvar
       if (aktualnyUtvar != null)
       {
        //Vykresli utvar podla typu
        switch (aktualnyUtvar.Typ)
        {
         case Utvar.TypUtvaru.Kruh:
          e.Graphics.FillEllipse(aktualnyUtvar.Farba, aktualnyUtvar.Pozicia);
          break;
         case Utvar.TypUtvaru.Obdlznik:
          e.Graphics.FillRectangle(aktualnyUtvar.Farba, aktualnyUtvar.Pozicia);
          break;
        }
       }
      }
    
      private void button1_Click(object sender, EventArgs e)
      {
       aktualnyUtvar = obdlznik1;
       panel1.Invalidate();
      }
    
      private void button2_Click(object sender, EventArgs e)
      {
       aktualnyUtvar = null;
       panel1.Invalidate();
      }
     }
    }
    

    Pozn.: Samozrejme ak chcete vykreslit viac objektov naraz, tak staci zmeny aktualnyUtvar na genericke pole, aby ste mohli pridavat/vymazat utvary. Potom uz len zmenite v OnPaint par veci, t.j. pred switch date slucku for, ktorou prejdete vsetky objekty pola a jednotlive vykreslite ...

    • Navržen jako odpověď Yuraj sobota 24. dubna 2010 16:30
    • Označen jako odpověď tapka pondělí 26. dubna 2010 8:06
    sobota 24. dubna 2010 16:21

Všechny reakce

  • Dobrý deň,

    ja by som to riešil nasledovne (s použitím komponenty Panel), vytvoriť triedu, ktorá bude ukladať informácie o útvare, po stlačení tlačidla nastaviť nejakú (čiže náš vybraný útvar) inštanciu triedy Utvar. Invalidate je potrebné zavolať na prekreslenie panela.:

    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace PaintTest
    {
     public partial class Form1 : Form
     {
      public Form1()
      {
       InitializeComponent();
      }
    
      public class Utvar
      {
       public enum TypUtvaru
    	  {
    	   Kruh,
         Obdlznik
    	  }
    
       public TypUtvaru Typ { get; set; }
       public Rectangle Pozicia { get; set; }
       public Brush Farba { get; set; }
    
       public Utvar(TypUtvaru typ, Rectangle pozicia, Brush farba)
       {
        this.Typ = typ;
        this.Pozicia = pozicia;
        this.Farba = farba;
       }
      }
    
      //Tu bude ulozeny utvar, ktory ma byt vykresleny
      //ak je null tak nebude zobrazeny
      Utvar aktualnyUtvar = null;
    
      //Tu mozu byt predefinovane utvary
      Utvar obdlznik1 = new Utvar(Utvar.TypUtvaru.Obdlznik, new Rectangle(5, 0, 20, 20), Brushes.Black);
    
      private void panel1_Paint(object sender, PaintEventArgs e)
      {
       //Pozadie panela biele (vykresli vyplneny obdlznik)
       e.Graphics.FillRectangle(Brushes.White, e.ClipRectangle);
    
       //Ak je priradeny utvar
       if (aktualnyUtvar != null)
       {
        //Vykresli utvar podla typu
        switch (aktualnyUtvar.Typ)
        {
         case Utvar.TypUtvaru.Kruh:
          e.Graphics.FillEllipse(aktualnyUtvar.Farba, aktualnyUtvar.Pozicia);
          break;
         case Utvar.TypUtvaru.Obdlznik:
          e.Graphics.FillRectangle(aktualnyUtvar.Farba, aktualnyUtvar.Pozicia);
          break;
        }
       }
      }
    
      private void button1_Click(object sender, EventArgs e)
      {
       aktualnyUtvar = obdlznik1;
       panel1.Invalidate();
      }
    
      private void button2_Click(object sender, EventArgs e)
      {
       aktualnyUtvar = null;
       panel1.Invalidate();
      }
     }
    }
    

    Pozn.: Samozrejme ak chcete vykreslit viac objektov naraz, tak staci zmeny aktualnyUtvar na genericke pole, aby ste mohli pridavat/vymazat utvary. Potom uz len zmenite v OnPaint par veci, t.j. pred switch date slucku for, ktorou prejdete vsetky objekty pola a jednotlive vykreslite ...

    • Navržen jako odpověď Yuraj sobota 24. dubna 2010 16:30
    • Označen jako odpověď tapka pondělí 26. dubna 2010 8:06
    sobota 24. dubna 2010 16:21
  • Děkuji za rady a ochotu.

    Nakonec se mi to podařilo vyřešit. Hledala jsem problém ve vykreslení a nakonec jsem zjistila, že tam byla akorát špatně zvolená barva vykreslení objektu, tak že objekt téměř nebyl vidět.

    pondělí 26. dubna 2010 8:06