C# programok ismertetése érdeklődőknek kezdőktől haladókig

C# MŰHELY

C# MŰHELY

GRAFIKA: Szöveg stílusának és a háttér színének változtatása

2020. július 20. - Benkő Tiborné

Írjunk programot, amely egy címke felületén a jobb egérgombbal megjelenő Betűtípus ablakból kiválasztva a  címkébe beírt szövegnek változtassa meg a betűstílusát és a méretét, A bal egérgombbal megjelenő Szín ablakból kiválasztott alapszínnel fesse ki a címke hátterét.

A feladat megoldása

         private void label1_MouseDown(object sender,
                                      MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Right:
                           FontDialog ftg = new FontDialog();
                           ftg.Font = label1.Font;
                           ftg.ShowDialog();
                           label1.Font = ftg.Font;
                           break;

                case MouseButtons.Left:
                           ColorDialog clg = new ColorDialog();
                           clg.Color = label1.BackColor;
                           clg.ShowDialog();
                           label1.BackColor = clg.Color;
                           break;
           }
       }

A program futási eredményei:

A jobb egérgombbal megjelenő Betűtípus ablak:

A  Betűtípus ablakból  Félkövér betűtípust és a 14 pixeles méretet kiválasztva

A megváltozott szöveg.

A bal egérgombbal a Szín ablak jelenik meg, a kiválasztott sárga alapszín lesz a címke háttere.

   

 

GRAFIKA: Pontok összekötése és törlése

Írjunk programot, amely az egér bal gombjával kattintva a kattintás helyét kék kereszttel jelölje és a következő pont helyét piros vonallal kösse össze Az egér jobb gombjával az utolsó kereszten kattintva törölje  vissza a vonalat az előző pontig, és haladva tovább újabb törlést is végezhessünk.

A feladat megoldása

            private List<Point> Pontok;
        public Form1()
        {
             InitializeComponent();
             Pontok = new List<Point>();
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Pontok.Add(e.Location);
                this.Refresh();
            }
            else if (e.Button == MouseButtons.Right)
            {
                Point mp = e.Location;
                foreach (Point pont in Pontok)
                {
                     if (Math.Sqrt(Math.Pow(mp.X - pont.X, 2) +
                         Math.Pow(mp.Y - pont.Y, 2)) < 5)
                     {
                        Pontok.Remove(pont);
                        this.Refresh();
                        break;
                     }
                }
            }
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen toll = new Pen(Brushes.Blue, 2);
            foreach (Point pont in Pontok)
            {
                e.Graphics.DrawLine(toll, pont.X - 6, pont.Y,
                                    pont.X + 6, pont.Y);
                e.Graphics.DrawLine(toll, pont.X, pont.Y - 6,
                                    pont.X, pont.Y + 6);
            }
            Point[] pontlanc = Pontok.ToArray();
            if (pontlanc.Length>1)
                e.Graphics.DrawLines(Pens.Red, pontlanc);
        }

A program futási eredményei:

Az utolsó vonal törlése.

További vonalak rajzolása.

 

GRAFIKA: Színkeverő

 Írjunk programot, amely színkeverést végez az R G B 0-255 közötti beállításával, és véletlenszám generátor használatával is, lehetőség legyen az inverz szín megjelenítésére.

A feladat megoldása

        Random m;

        public Form1()
        {
            InitializeComponent();

            // meglévő eseménykezelő hozzáadása
            RGorgeto.ValueChanged += this.button1_Click;
            GGorgeto.ValueChanged += this.button1_Click;
            BGorgeto.ValueChanged += this.button1_Click;
            m = new Random();
            RGorgeto.Maximum = 255;
            GGorgeto.Maximum = 255;
            BGorgeto.Maximum = 255;
        }

        private void Veletlenszam_Click(object sender, EventArgs e)
        {
            RGorgeto.Value = m.Next(256);
            GGorgeto.Value = m.Next(256);
            BGorgeto.Value = m.Next(256);
            textBox1.Text = RGorgeto.Value.ToString();
            textBox2.Text = GGorgeto.Value.ToString();
            textBox3.Text = BGorgeto.Value.ToString();
        }

        private void RGorgeto_Scroll(object sender,
                                     ScrollEventArgs e)
        {
            textBox1.Text = RGorgeto.Value.ToString();
        }

        private void GGorgeto_Scroll(object sender,
                                     ScrollEventArgs e)
        {
             textBox2.Text = GGorgeto.Value.ToString();
        }

        private void BGorgeto_Scroll(object sender,
                                     ScrollEventArgs e)
        {
             textBox3.Text = BGorgeto.Value.ToString();
        }

        private void Inverzszin_Click(object sender, EventArgs e)
        {
            RGorgeto.Value = 255 - RGorgeto.Value;
            GGorgeto.Value = 255 - GGorgeto.Value;
            BGorgeto.Value = 255 - BGorgeto.Value;
            textBox1.Text = RGorgeto.Value.ToString();
            textBox2.Text = GGorgeto.Value.ToString();
            textBox3.Text = BGorgeto.Value.ToString();
        }

        private void Kilepes_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            Rectangle t = new Rectangle(new Point (396,70),
                          new Size(80,80));
            SolidBrush b = new SolidBrush(Color.FromArgb(RGorgeto.Value,
                                          GGorgeto.Value,BGorgeto.Value));
            g.FillRectangle(b, t);
        }

A program futási eredményei:

Előző szín inverz színe

 

 

GRAFIKA: Szöveg forgatása

 Írjunk programot, amely a megadott szöveget 30 fokonként forgatja.

 A feladat megoldása

                        private Rectangle textR = new Rectangle(30, 0, 150, 20);
        String s;

        private void Megjelenit_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            StringFormat oStringFormat = new StringFormat();
            oStringFormat.Alignment = StringAlignment.Center;
            Font font = new Font("Arial", 12,
                                 FontStyle.Bold | FontStyle.Italic);
            SolidBrush br = new SolidBrush(Color.AliceBlue);
            SolidBrush br2 = new SolidBrush (Color.Blue);
            s = textBox1.Text;
            // A koordináta-rendszert az ablak közepébe mozgatjuk
            g.TranslateTransform(this.ClientSize.Width / 2,
                                 this.ClientSize.Height / 2);
            // 12-szer megjelenítjük a szöveget, 30 fokonként 
            // elforgatva, és 1.02-szörösre növelve a méretét
            for (int a = 0; a < 12; a++)
            {
                g.FillRectangle(br, textR);
                g.DrawString(s, font, br2, textR, oStringFormat);
                g.RotateTransform(30);
                g.ScaleTransform(1.02f, 1.02f);
            }
            // A transzformációk törlése
            g.ResetTransform();
            br.Dispose();
            br2.Dispose();
        }

        private void Töröl_Click(object sender, EventArgs e)
        {
            Refresh();
            textBox1.Text = "Balaton";
        }

A program futási eredményei:

 

 

GRAFIKA: DrawPolygon és a FillPolygon bemutatása

Írjunk programot, amely bemutatja a DrawPolygon és a FillPolygon használatát.

        // Az első poligon csúcspontjai
       Point[] pontok = new Point[] { new Point(30,30),
                                      new Point(100,100),
                                      new Point(130,30),
                                      new Point(30,30)
                                    };
        int[] y2 = { 150,220,150,150};

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            Rectangle r = new Rectangle(0,0,300,260);
            Font font = new Font("Arial", 8);
            SolidBrush b = new SolidBrush(Color.Red);
            
            // zöld keret rajzolása
            g.DrawRectangle(Pens.Green, 15, 15,
                            this.ClientSize.Width-30,
                            this.ClientSize.Height-30) 
            // Piros színű poligon rajzolása        
            g.DrawPolygon(Pens.Red, pontok);
            // DrawPolygon szöveg kiírása piros színnel
            g.DrawString("DrawPolygon", font, b, new Point(150,70));

            // eltolás le 100 pixellel
            for (int i = 0; i < pontok.Length; i++)
                pontok[i].Y += 100;
            // kék színű poligon rajzolása
            g.DrawPolygon(Pens.Blue, pontok);

            // eltolás jobbra 120 pixellel
            for (int i = 0; i < pontok.Length; i++)       
                pontok[i].X += 120;
            // kék színnel befestett poligon rajzolása
             g.FillPolygon(Brushes.Blue, pontok);

            // FillPolygon szöveg kiírása kék színnel
            g.DrawString("FillPolygon", font,
                                       new SolidBrush(Color.Blue),
                                       new Point(170, 230));
              //DrawPolygon szöveg kiírása kék színnel
            g.DrawString("DrawPolygon", font,
                                       new SolidBrush(Color.Blue),
                                       new Point(60, 230));
       }

A program futási eredménye: 

GRAFIKA: DrawLine bemutatása

Írjunk programot, amely 3 pontból úgy rajzol 10 vonalat, hogy azok találkozzanak.

A feladat megoldása

             private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            int fw = this.ClientSize.Width;
            int fh = this.ClientSize.Height;
            g.DrawLine(Pens.Blue, new Point(30, 50),
                       new Point(fw - 30, 50));
            for (int i = 0; i <= 10; i++)
                g.DrawLine(Pens.Blue, new Point(30, 50),
                       new Point(30 + i * (fw - 60) / 10, fh - 50));

           for (int i = 0; i <= 10; i++)
                g.DrawLine(Pens.Green, new Point(fw - 30, 50),
                        new Point(30 + i * (fw - 60) / 10, fh - 50));

            for (int i = 0; i < 10; i++)
                g.DrawLine(Pens.Red, new Point(fw/2, 50),
                        new Point(30 + i * (fw - 60) / 10, fh - 50));
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
             Refresh();
        }

A program futási eredménye:

GRAFIKA: Befestett körívek rajzolása

Írjunk programot,amely különböző színekkel befestett ellipszist, kört, körcikkeket és kör- valamint ellipszis szeleteket rajzol.

A feladat megoldása

            private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.Clear(Color.White);
            Rectangle r = new Rectangle(new Point(10, 10),
                          new Size((int)(this.Width - 30),
                          (int)(this.Height - 55)));
            g.DrawRectangle(Pens.Black, r);
            Rectangle e1 = new Rectangle(20, 30, 50, 70);
            g.FillEllipse(Brushes.Aqua, e1);
            Rectangle e2 = new Rectangle(100, 30, 70, 50);
            g.FillEllipse(Brushes.Goldenrod, e2);
            Rectangle e3 = new Rectangle(190, 30, 50, 50);
            g.FillEllipse(Brushes.GreenYellow, e3);

            Rectangle a1 = new Rectangle(20, 100, 60, 60);
            g.FillPie(Brushes.Coral, a1, 0, 90);
            Rectangle a2 = new Rectangle(100, 100, 60, 60);
            g.FillPie(Brushes.Blue, a2, 90, 90);
            Rectangle a3 = new Rectangle(190, 100, 60, 60);
            g.FillPie(Brushes.Green, a3, 180, 80);
            Rectangle a4 = new Rectangle(200, 100, 60, 60);
            g.FillPie(Brushes.Yellow, a4, 270, 90);

            Rectangle a5 = new Rectangle(20, 170, 60, 60);
            for (int i = 0; i < 360; i += 30)
            {
                g.FillPie(Brushes.Gainsboro, a5, i, 20);
            }
            Rectangle a6 = new Rectangle(100, 170, 30, 60);
            for (int i = 0; i < 360; i += 30)
            {
                g.FillPie(Brushes.DarkOrange, a6, i, 20);
            }

A program futási eredménye:

GRAFIKA: Körívek rajzolása

Írjunk programot,amely piros színnel rajzol teljes ellipszist, kört, kék színnel köríveket, zöld színnel szaggatottan kört és ellipszist.

A feladat megoldása

            private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.Clear(Color.White);// fehér háttér
            Rectangle r = new Rectangle(new Point(10,10),
                          new Size ((int)(this.Width-30),
                         (int)(this.Height-55)));
            g.DrawRectangle(Pens.Black,r); // fekete keret
            Rectangle e1 = new Rectangle(20,30,50,70);
            g.DrawEllipse(Pens.Red, e1);
            Rectangle e2 = new Rectangle(100, 30, 70, 50);
            g.DrawEllipse(Pens.Red, e2);
            Rectangle e3 = new Rectangle(190, 30, 50, 50);
            g.DrawEllipse(Pens.Red, e3);

            Rectangle a1 = new Rectangle(20, 100, 60, 60);
            g.DrawArc(Pens.Blue, a1,0,90);
            Rectangle a2 = new Rectangle(100, 100, 60, 60);
            g.DrawArc(Pens.Blue, a2, 90, 90);
            Rectangle a3 = new Rectangle(190, 100, 60, 60);
            g.DrawArc(Pens.Blue, a3, 180, 90);
            Rectangle a4 = new Rectangle(200, 100, 60, 60);
            g.DrawArc(Pens.Blue, a4, 270, 90);

            // A szaggatott ellipszisek rajzolása ívekkel
            Rectangle a5 = new Rectangle(20, 170, 60, 60);
            for (int i = 0; i < 360; i += 30)
            {
                g.DrawArc(Pens.LimeGreen, a5, i, 20);
            }

            Rectangle a6 = new Rectangle(100, 170, 30, 60);
            for (int i = 0; i < 360; i += 30)
            {
                 g.DrawArc(Pens.LimeGreen, a6, i, 20);
            }

A  program futási eredménye:

Két 6 jegyű oktális szám összeadása

Írjunk függvényt  két 6 jegyű oktális szám összeadásra.
A függvény fejléce:

    static int oct_add(string s1, string s2, ref int[] eredm)

Bemenő paraméterek: s1, s2 típusú 6 karaktert tároló karaktertömb,

                                   ebben kapja meg a függvény az összeadandó oktális
                                   számokat karakter formában.

Kimenő paraméter:     eredm maximálisan 6 jegyet tartalmazó egész
                                   típusú tömb, amely a 0..7 tartományban tárolja az
                                   értékeket.

A függvény a két oktális szám összeadásakor keletkezett hetedik digitre történő átvi­telt (túlcsordulást) visszatérési értékként adja vissza. A túlcsordulás azt jelenti, hogy a két szám összege nem fér el a 6 digiten, melyet az eseménykezelő a ”túlcsordult” szöveg kiírásával jelez.

Az oct_add függvénynek szüksége van két lokális változóra:

carry      egész típusú változó, amely 0..1 értéket veheti fel, ez az átvitel, illetve a túlcsordulás
                       jelzésére szolgál
ered       egész típusú változó, amely két digit összegét tartalmazza

A carry alapállapota nulla. A legalacsonyabb helyi értéktől kezdjük az össze­adást. A beolvasásnál az utoljára beolvasott karakter az 5. pozícióba kerül, tehát a ciklust 5-tól kell lefelé számláltatni 0-ig. Az oktális számok az s1,s2 karak­tertömbben vannak. Számjeggyé alakíthatjuk, ha kivonjuk belőle a '0' karakter értékét:

     s1[i] - '0'

Az ered változóba tároljuk a két oktális szám i-edik digitjének a carry tartal­mával módosított összegét. Ha az ered értéke nagyobb 7-nél, ezt az átvitelt a carry tárolja, melyet a következő digit összeadásánál figyelembe kell venni. Az eredm egész típusú tömb i-edik eleme tartalmazza az i-edik digit összegét, melyről az átvitelt le kell választani:

      eredm[i] = ered & 7;

Például:   7 + 7 = 14

            14  kettes számrendszerben  1110:= 8 + 4 + 2 +0,

            az utolsó három digitre kell a 7 (111) maszkot használni, ez választja
            le az átvitelt:

             1110   14
             0111     7
            -------------
             0110 -> 6

 az ÉS  (&) utasítással:

             14 & 7 = 6

 Ha a legmagasabb helyi értéken történt az összeadásnál átvitel, akkor ez szá­munkra túlcsordulást jelent, ezt az értéket kell a függvény­nek visszaadnia.

        static string oct_read(string oct, out int hiba1,
                                           out int
hiba2)
        {
            int i, h, k;
            hiba1 = hiba2 = 0;
            h = oct.Length;
            if (h == 6)
            {
                for (i = 0; i < h; i++)
                {
                    k = oct[i] - '0';
                    if (k > 7)
                    {
                        hiba1 = i + 1;
                        return oct;
                    }
                }
            }
            else if (h < 6 || h > 6)
                hiba2 = h;
            return oct;
        }

        static int oct_add(string s1, string s2, ref int[] eredm)
        {
            int carry = 0;
            int i, ered;
            for (i = 5; i >= 0; i--)
            {
                ered = carry + (s1[i] - '0') + (s2[i] - '0');
                if (ered > 7) carry = 1; else carry = 0;
                eredm[i] = ered & 7;
            }
            return carry;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string okt1="", okt2="", okt1j="", okt2j="";
            int i = 1, v;
            int hiba1 = 0, hiba2 = 0;
            int[] összeg = new int[6] { 0, 0, 0, 0, 0, 0 };
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                okt1 = textBox1.Text;
                okt1j = oct_read(okt1, out hiba1, out hiba2);
                if (hiba1 != 0)
                    MessageBox.Show("adat: " + okt1.ToString() + "\n"
                                    + hiba1.ToString() +
                                    ". digit hibás! ",
"Hibajelzés");
                if (hiba2 != 0)
                    MessageBox.Show("adat: " + okt1.ToString() + "\n"
                                     + "A szám hatjegyű lehet: ez " +
                                    hiba2.ToString(), "Hibajelzés");
                if (hiba1 != 0 || hiba2 != 0)
                {
                    textBox1.Text = ""; textBox3.Text = "";
                    okt1j = ""}

                else
                    textBox1.Text = okt1j;
                okt2 = textBox2.Text;
                okt2j = oct_read(okt2, out hiba1, out hiba2);
                if (hiba1 != 0)
                    MessageBox.Show("adat: " + okt2.ToString() +
                                    "\n"+ hiba1.ToString() +
                                    ". digit hibás
",Hibajelzés");
                if (hiba2 != 0)
                   MessageBox.Show("adat: " + okt2.ToString() + "\n" 
                                   + "A szám hatjegyű lehet: ez "
                                   hiba2.ToString(), "Hibajelzés");

                if (hiba1 != 0 || hiba2 != 0)
                {
                    textBox2.Text = ""; textBox3.Text = "";
                    okt2j = "";

                }
                else
                    textBox2.Text = okt2j;
            }
            textBox3.Text = "";
            if (okt1j != "" && okt2j != "")
            {
                v = oct_add(okt1j, okt2j, ref összeg);
                if (v == 1) MessageBox.Show("Túlcsordult");
                else
                {
                   for (i = 0; i <= 5; i++)
                      textBox3.Text += összeg[i].ToString();
                }
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
             textBox3.Text = "";
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
             textBox3.Text = "";
        }

A program futási eredményei:

   

   

GRAFIKA: Alakzatok rajzolása

Írjunk programot, amely nyomógombok segítségével  téglalapot, kört és ellipszist rajzol különböző színekkel befestve, valamit rádiógombok használatával kék keretű és sárga színnel befestett négyzetbe piros, kék, zöld és barna színnel befestett kört rajzol.

A feladat megoldása

        Pen p = new Pen(Color.Blue, 2);
        bool negyzetbenKor = false;
        Brush ecset;
        Rectangle t = new Rectangle(new Point(100, 50),
                                    new Size(100, 100));

        private void Form1_Load(object sender, EventArgs e)
        {
            radioButton1.Checked = true;
            radioButton2.Checked = false;
            radioButton3.Checked = false;
            radioButton4.Checked = false;
            radioButton5.Checked = false;
        }

        private void radioButton1_CheckedChanged(object sender,
                                                 EventArgs e)
        {
            negyzetbenKor = false;
            Refresh();
        } 

        private void radioButton2_CheckedChanged(object sender,
                                                 EventArgs e)
        {
            ecset = Brushes.Red;
            negyzetbenKor = true;
            Refresh();
        }

        private void radioButton3_CheckedChanged(object sender,
                                                 EventArgs e)
        {
            ecset = Brushes.Blue;
            negyzetbenKor = true;
            Refresh();
        }

        private void radioButton4_CheckedChanged(object sender,
                                                 EventArgs e)
        {
            ecset = Brushes.Green;
            negyzetbenKor = true;
            Refresh();
        }

        private void radioButton5_CheckedChanged(object sender,
                                                 EventArgs e)
        {
            ecset = Brushes.Chocolate;
            negyzetbenKor = true;
            Refresh();
        }

        private void Teglalap_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            Rectangle t = new Rectangle(new Point(30, 170),
                                        new Size(50, 80));
            g.DrawRectangle(p, t);
            g.FillRectangle(Brushes.LightGreen, t);
        }

        private void Kor_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            Rectangle t1 = new Rectangle(new Point(140, 170),
                           new Size(50, 50));
            g.FillEllipse(Brushes.Turquoise, t1);
        }

        private void Ellipszis_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            Rectangle t2 = new Rectangle(new Point(250, 150),
                                         new Size(50, 100));
            g.FillEllipse(Brushes.LightSeaGreen, t2);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (negyzetbenKor)
            {
                Graphics g = e.Graphics;
                g.DrawRectangle(p, t);
                g.FillRectangle(Brushes.Yellow, t);
                g.FillEllipse(ecset, t);
            }
        }       

A program futási eredményei:

 

süti beállítások módosítása