rysowanie w picturebox

0

Hej
Nie wie jak odświeżyć picturebox.
Mam stworzone dwa przyciski dzięki którym rysuje (w dwóch różnych kolorach ) w picturebox.
Jak używam pierwszego to wszystko w porządku (rysuje co chce), ale jak używam już drugiego to co narysowałem na początku znika.
Chce móc wiedzieć to co narysowałem tymi dwoma kolorami jednocześnie i móc je zapisać

Jak to objeść?, żeby te pierwsze krzywe co narysowałem mi nie znikły?

0

pokaż kod :)

0

A rysujesz w PictureBoksie (dobrze), czy na PictureBoksie (źle)?

0

to kod :

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class edycja zdjecia : Form
    {
        public edycja zdjecia()
        {
            InitializeComponent();
            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);  
        }

        private Image Img;

        Point p1_niebieski;
        Point p2_niebieski;

        Point p1_zolty;
        Point p2_zolty;

        Point p1_czerwony;
        Point p2_czerwony;

        List<Point> p1List_niebieski = new List<Point>();
        List<Point> p2List_niebieski = new List<Point>();

        List<Point> p1List_zolty = new List<Point>();
        List<Point> p2List_zolty = new List<Point>();

        List<Point> p1List_czerwony = new List<Point>();
        List<Point> p2List_czerwony = new List<Point>();


        Pen p;
        int kol = 0;

        string zapytanie_nr_zdjecia;
        System.Data.SqlServerCe.SqlCeConnection con;
        System.Data.SqlServerCe.SqlCeDataAdapter da;
        DataSet ds_nr_zdjecia;

        private void edycja zdjecia_Load(object sender, EventArgs e)
        {
            con = new System.Data.SqlServerCe.SqlCeConnection();
            con.ConnectionString = "Data Source=C:\\Users\\Lukasz\\Desktop\\bazazdjecia.sdf";
            con.Open();
            con.Close();
        }

        private void pictureBox1_Click_1(object sender, EventArgs e)
        {

        }

        private void pictureBox1_MouseClick_1(object sender, MouseEventArgs e)
        {
            if (kol == 1)
            {
                if (p1_niebieski.X == 0)
                {
                    p1_niebieski.X = e.X;
                    p1_niebieski.Y = e.Y;
                }
                else
                {
                    p2_niebieski.X = e.X;
                    p2_niebieski.Y = e.Y;
                    p1List_niebieski.Add(p1_niebieski);
                    p2List_niebieski.Add(p2_niebieski);
                    pictureBox1.Invalidate();
                    p1_niebieski.X = 0;
                }
            }

            if (kol == 2)
            {
                if (p1_zolty.X == 0)
                {
                    p1_zolty.X = e.X;
                    p1_zolty.Y = e.Y;
                }
                else
                {
                    p2_zolty.X = e.X;
                    p2_zolty.Y = e.Y;
                    p1List_zolty.Add(p1_zolty);
                    p2List_zolty.Add(p2_zolty);
                    pictureBox1.Invalidate();
                    p1_zolty.X = 0;
                }
            }

            if (kol == 3)
            {
                if (p1_czerwony.X == 0)
                {
                    p1_czerwony.X = e.X;
                    p1_czerwony.Y = e.Y;
                }
                else
                {
                    p2_czerwony.X = e.X;
                    p2_czerwony.Y = e.Y;
                    p1List_czerwony.Add(p1_czerwony);
                    p2List_czerwony.Add(p2_czerwony);
                    pictureBox1.Invalidate();
                    p1_czerwony.X = 0;
                }
            }
        }

        private void pictureBox1_Paint_1(object sender, PaintEventArgs e)
        {
            if (kol == 1)
            {

                p = new Pen(Color.Blue, 5);

                for (int x = 0; x < p1List_niebieski.Count; x++)
                {
                    Graphics g = e.Graphics;
                    g.DrawLine(p, p1List_niebieski[x], p2List_niebieski[x]);

                }
            }

            if (kol == 2)
            {
                p = new Pen(Color.Yellow, 5);

                for (int x = 0; x < p1List_zolty.Count; x++)
                {
                    Graphics g = e.Graphics;
                    g.DrawLine(p, p1List_zolty[x], p2List_zolty[x]);
                    
                }
            }

            if (kol == 3)
            {
                p = new Pen(Color.Red, 5);

                for (int x = 0; x < p1List_czerwony.Count; x++)
                {
                    Graphics g = e.Graphics;
                    g.DrawLine(p, p1List_czerwony[x], p2List_czerwony[x]);

                }
            }

            if (kol == 0)
            {
                
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {

            Pen p = new Pen(Color.Blue, 5);
            kol = 1;
            
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Yellow, 5);
            kol = 2;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Red, 5);
            kol = 3;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            p1List_niebieski.Clear();
            p2List_niebieski.Clear();

            p1List_zolty.Clear();
            p2List_zolty.Clear();

            p1List_czerwony.Clear();
            p2List_czerwony.Clear();

            pictureBox1.Refresh();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox1.Refresh();
        }
       
    }
}

1

private void pictureBox1_Paint_1(object sender, PaintEventArgs e)

Nie rysujemy w zdarzeniu PictureBox.Paint, bo to tak jakbyś rysował na panelu, tracisz zalety pictureboksa.

wyrzuć zdarzenie i Refresh. przy starcie programu daj

pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);

(zakładam że rozmiar kontrolki się nie zmienia).

Potem przy Click czy kiedy tam chcesz, rysuj w ten sposób:

using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
  // rysujemy
}
// jeśli będzie trzeba: pictureBox1.Invalidate();
0
        private void button2_Click(object sender, EventArgs e)
        {
            using (Bitmap bmp = new Bitmap(this.pictureBox1.Image))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.DrawRectangle(new Pen(Color.Red), new Rectangle(new Point(10, 10), new Size(50, 50)));
                }
                this.pictureBox2.Image = (Bitmap)bmp.Clone();
            }
        }
0

Nadal bez efektu :(

 
 private void pictureBox1_Paint_1(object sender, PaintEventArgs e)
        {

 }
0

takie coś miałem zrobić?

0

Nie. Powiedz co chcesz osiągnąć, rysowanie np tak jak Paint?

0

Aż takich krzywych nie potrzebuje. Chce móc tworzyć proste odcinki w różnych kolorach jednocześnie. Zaznaczam początkowy punkt A i końcowy punkt B i z puntu A do punktu B tworzy mi się odcinek. Zrobiłem tak że tworze te odcinki w różnych kolorach, ale jak przełączam np: z niebieskiego koloru na kolor żółty lub czerwony to to co narysowałem kolorem niebieskim mi znika. Mogę rysować tylko jednym kolorem, a ja chce widzieć to co narysowałem wszystkimi trzeba kolorami.

0
        private bool bClick = true;
        private Point point1;
        private Point point2;
        private Color color = Color.Red;

        private void pictureBox1_MouseClick(object sender, MouseEventArgs e) //klikniecie na obrazek
        {
            if (this.bClick)
            {
                this.point1 = e.Location;
                this.bClick = false;
            }
            else
            {
                this.point2 = e.Location;
                this.DrawLine();
                this.bClick = true;
            }
        }

        private void DrawLine() //rysowanie linii
        {
            using (Bitmap bmp = new Bitmap(this.pictureBox1.Image))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.DrawLine(new Pen(this.color), this.point1, this.point2);
                }

                this.pictureBox1.Image = (Bitmap)bmp.Clone();
            }
        }

dodaj jeszcze pod przyciski zmieniające kolor:

this.color = Color.Green //i tu wybierz kolor.
0

Dziękuje za pomoc, już wszystko działa. Wisze Ci piwo :)

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