DrawLine продолжает рисовать в неправильном положении х и у

Я только начал изучать C#, и у меня есть задание, где я должен

  1. Выберите кнопку "lijn"
  2. Выберите актера (изображение 1, 2 или 3, которое здесь называется actor1/actor2/actor3).
  3. Нажмите где-нибудь в большой картинке (которая занимает весь экран)

Однако, когда я щелкаю где-нибудь на экране, он рисует линию с p1, равным 0,0, и p2, где-то нелогично (разные для каждого актера, но всегда в одном и том же месте).

Вероятно, я допустил несколько серьезных ошибок и знаю, что мой код действительно плохой, но имейте в виду, что я только начал учиться, и у меня возникли некоторые трудности:)

было бы здорово, если бы кто-нибудь знал, как это исправить!

Соответствующая часть (полный код ниже):

int x;
int y;
Point p1;
Point p2;
List<Ellipses> ellipselijst = new List<Ellipses>();
List<Textbox> boxlijst = new List<Textbox>();
List<Lijn> lijnlijst = new List<Lijn>();
int actorselected;
int clicklocationx;
int clicklocationy;


private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
    x = e.X;
    y = e.Y;
    Ellipses mooieellipse = new Ellipses(x, y);
    ellipselijst.Add(mooieellipse);
    Textbox mooiebox = new Textbox(x, y);
    boxlijst.Add(mooiebox);
    Lijn mooielijn = new Lijn(p1, p2);
    lijnlijst.Add(mooielijn);
    int clicklocationx = e.X;
    int clicklocationy = e.Y;
    this.Refresh();                       
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    if (radiolijn.Checked == true)
    {
        //Draw vanaf actor 1
        //p1 moet location van picture box zijn. p2 moet de location van mouseclick zijn
        if (actorselected == 1)
        {
            p1 = new Point (actor1.Location.X, actor1.Location.Y);
            p2 = new Point(clicklocationx, clicklocationy);

            foreach (Lijn l in lijnlijst)
            {
                g.DrawLine(new Pen(Brushes.Black), p1, p2);
            }
        }

        //Draw vanaf actor 2
        //p1 moet location van picture box zijn. p2 moet de location van mouseclick zijn            
        if (actorselected == 2)
        {
            p1 = new Point(actor2.Location.X, actor2.Location.Y);
            p2 = new Point(clicklocationx, clicklocationy);
            foreach (Lijn l in lijnlijst)
            {
                g.DrawLine(new Pen(Brushes.Black), p1, p2);
            }
        }

        //Draw vanaf actor 3
        //p1 moet location van picture box zijn. p2 moet de location van mouseclick zijn
        if (actorselected == 3)
        {
            p1 = new Point(actor3.Location.X, actor3.Location.Y);
            p2 = new Point(clicklocationx, clicklocationy);
            foreach (Lijn l in lijnlijst)
            {
                g.DrawLine(new Pen(Brushes.Black), p1, p2);
            }
        }
    }
}

private void actor1_Click(object sender, EventArgs e)
{
    actorselected = 1;
}

private void actor2_Click(object sender, EventArgs e)
{
    actorselected = 2;
}

private void actor3_Click(object sender, EventArgs e)
{
    actorselected = 3;
}

Класс "Лижн":

public class Lijn
{
    public Point punt1;
    public Point punt2;

    public Lijn(Point p1, Point p2)
    {            
        punt1 = p1;
        punt2 = p2;
    }
}

Полный код:

public partial class Formcase : Form
{
    int aantalactors = 0;

    public Formcase()
    {
        InitializeComponent();
        actor1.Visible = false;
        actor2.Visible = false;
        actor3.Visible = false;
    }

    private void addactorbtn_Click(object sender, EventArgs e)
    {
        aantalactors++;

        if (aantalactors == 1)
        {
            actor1.Visible = true;
        }

        if (aantalactors == 2)
        {
            actor2.Visible = true;
        }

        if (aantalactors == 3)
        {
            actor3.Visible = true;
        }
    }

    int x;
    int y;
    Point p1;
    Point p2;
    List<Ellipses> ellipselijst = new List<Ellipses>();
    List<Textbox> boxlijst = new List<Textbox>();
    List<Lijn> lijnlijst = new List<Lijn>();
    int actorselected;
    int clicklocationx;
    int clicklocationy;

    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {
        x = e.X;
        y = e.Y;
        Ellipses mooieellipse = new Ellipses(x, y);
        ellipselijst.Add(mooieellipse);
        Textbox mooiebox = new Textbox(x, y);
        boxlijst.Add(mooiebox);
        Lijn mooielijn = new Lijn(p1, p2);
        lijnlijst.Add(mooielijn);
        int clicklocationx = e.X;
        int clicklocationy = e.Y;
        this.Refresh();                       
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        if (radioellipse.Checked == true)
        {
            foreach (Ellipses p in ellipselijst)
            {
                g.DrawEllipse(new Pen(Brushes.Black), new Rectangle(new Point(p.x - 50, p.y - 50), new Size(100, 100)));
            }
        }

        if (radiobtntekst.Checked == true)
        {
            foreach (Textbox t in boxlijst)
            {
                TextBox txtbox = new TextBox();
                txtbox.Location = new Point(t.x + 125, t.y + 25);
                this.Controls.Add(txtbox);
                txtbox.BringToFront();
            }
        }
        if (radiolijn.Checked == true)
        {               
            //Draw vanaf actor 1
            //p1 moet location van picture box zijn. p2 moet de location van mouseclick zijn
            if (actorselected == 1)
            {
                p1 = new Point (actor1.Location.X, actor1.Location.Y);
                p2 = new Point(clicklocationx, clicklocationy);

                foreach (Lijn l in lijnlijst)
                {
                    g.DrawLine(new Pen(Brushes.Black), p1, p2);
                }
            }

            //Draw vanaf actor 2
            //p1 moet location van picture box zijn. p2 moet de location van mouseclick zijn            
            if (actorselected == 2)
            {
                p1 = new Point(actor2.Location.X, actor2.Location.Y);
                p2 = new Point(clicklocationx, clicklocationy);
                foreach (Lijn l in lijnlijst)
                {
                    g.DrawLine(new Pen(Brushes.Black), p1, p2);
                }
            }

           //Draw vanaf actor 3
           //p1 moet location van picture box zijn. p2 moet de location van mouseclick zijn
            if (actorselected == 3)
            {
                p1 = new Point(actor3.Location.X, actor3.Location.Y);
                p2 = new Point(clicklocationx, clicklocationy);
                foreach (Lijn l in lijnlijst)
                {
                    g.DrawLine(new Pen(Brushes.Black), p1, p2);
                }
            }
        }
    }

    private void actor1_Click(object sender, EventArgs e)
    {
        actorselected = 1;
    }

    private void actor2_Click(object sender, EventArgs e)
    {
        actorselected = 2;
    }

    private void actor3_Click(object sender, EventArgs e)
    {
        actorselected = 3;
    }
}

1 ответ

У вас есть два набора переменных clicklocation - один глобальный и один локальный для вашего обработчика щелчка мыши. Избавься от последнего.

Другие вопросы по тегам