DrawLine продолжает рисовать в неправильном положении х и у
Я только начал изучать C#, и у меня есть задание, где я должен
- Выберите кнопку "lijn"
- Выберите актера (изображение 1, 2 или 3, которое здесь называется actor1/actor2/actor3).
- Нажмите где-нибудь в большой картинке (которая занимает весь экран)
Однако, когда я щелкаю где-нибудь на экране, он рисует линию с 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 - один глобальный и один локальный для вашего обработчика щелчка мыши. Избавься от последнего.