C# 2次点击&;双击在picturebox上创建线条和点

C# 2次点击&;双击在picturebox上创建线条和点,c#,picturebox,C#,Picturebox,我已经为此挣扎了几天,一直担心寻求帮助,因为我担心我不会很好地解释它,它可能看起来过于复杂。但我已经到了不知道还能做什么的地步。这就来了 我有一个带图片的盒子。最初,我只需要单击图像上的一个点,然后在两个点之间绘制第二个点和一条线。包含p1和p2的列表(p1.X,p1.Y)和(p2.X,p2.Y)。他们创建这条线的“区域”也会被记录下来,这是由他们创建这条线的地方的RGB值决定的 这很有效。我还有一个按钮,可以通过删除添加到列表中的最后一个点并刷新picturebox来删除您创建的线条 然后,当

我已经为此挣扎了几天,一直担心寻求帮助,因为我担心我不会很好地解释它,它可能看起来过于复杂。但我已经到了不知道还能做什么的地步。这就来了

我有一个带图片的盒子。最初,我只需要单击图像上的一个点,然后在两个点之间绘制第二个点和一条线。包含p1和p2的列表(p1.X,p1.Y)和(p2.X,p2.Y)。他们创建这条线的“区域”也会被记录下来,这是由他们创建这条线的地方的RGB值决定的

这很有效。我还有一个按钮,可以通过删除添加到列表中的最后一个点并刷新picturebox来删除您创建的线条

然后,当他们要求创建一个特定大小的点时,一把活动扳手被扔了进去。所以我制作了一个小的red dot.png图像。然后设置双击事件,这样当他们双击时,它会在他们双击的位置将dot.png添加到picturebox中。这是一种很好的方式,因为创建线是通过单击2个点来创建的,因此这也有利于记录p1和p2位置以及单击的区域。所以我一石二鸟

然而,问题在于去除这些点。记得最初我只是能够删除p1和p2的最后一个条目。但是,这不会删除点,因为它是一个单独的图像,它只会删除dot.png的p1、p2位置

所以我想我应该创建一个单独的删除按钮来清除最后创建的点。我不想这样做,我宁愿有一个按钮,但在这种情况下,我不认为这将是可能的

我试图创建一个点列表,然后将点添加到picturebox中,但我一直遇到这个问题。去掉1点就可以了。但如果你有2个点,并试图删除1,你会得到一个越界错误。所以我想这是因为我没有使用列表中的点,即使图像上有2个点,但就应用程序而言,实际上只有1个点,所以删除1就像删除所有点一样

但这就是我所拥有的。希望你的头不疼

private void RemoveDot_Click(object sender, EventArgs e)
{
    if (dbldot.Images.Count != 0)
    {
        pictureBox1.Controls.RemoveAt(dbldot.Images.Count - 1);
        p1List.RemoveAt(p1List.Count - 1);
        p2List.RemoveAt(p2List.Count - 1);
        pictureBox1.Refresh();
    }
}


private void RemoveLine_Click(object sender, EventArgs e)
{
    if (p1List.Count != 0 && p2List.Count != 0)
    {
        p1List.RemoveAt(p1List.Count - 1);
        p2List.RemoveAt(p2List.Count - 1);
        pictureBox1.Refresh();
    }


void picture_DoubleClick(object sender, EventArgs e)
{
    doubletime ++;

    PictureBox dot = new PictureBox();
    {
        dot.Name = "reddot";
        dot.Size = new Size(16, 16);
        dot.Image = Resources.red_dot_32;
        dot.SizeMode = PictureBoxSizeMode.CenterImage;
        dot.Location = new Point(p2.X - 7, p2.Y - 7);
    }
    for (int x = 0; x < doubletime; x++)
    {
        dbldot.Images.Add(dot.Image);
    }

    pictureBox1.Controls.Add(dot);
}


private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button.Equals(MouseButtons.Left))
    {
        if (p1.X == 0)
        {
            p1.X = e.X;
            p1.Y = e.Y;

            var color = zoneMap1.GetPixel(e.X, e.Y);
            if (color == Color.FromArgb(0, 0, 255))
            {
                Zone1.Add("1");
            }
            else if (color == Color.FromArgb(0, 255, 0))
            {
                Zone1.Add("2");
            }
            else if (color == Color.FromArgb(255, 150, 1))
            {
                Zone1.Add("3");
            }
            else if (color == Color.FromArgb(255, 0, 0))
            {
                Zone1.Add("4");
            }
            else if (color == Color.FromArgb(255, 0, 255))
            {
                Zone1.Add("5");
            }
            else if (color == Color.FromArgb(0, 255, 255))
            {
                Zone1.Add("6");
            }
            else if (color == Color.FromArgb(255, 255, 0))
            {
                Zone1.Add("7");
            }
            else
            {
                MessageBox.Show("This void is not within the void area.");
                p1.X = 0;
            }
        }
        else
        {
            p2.X = e.X;
            p2.Y = e.Y;

            p1List.Add(p1);
            p2List.Add(p2);

            Invalidate();
            pictureBox1.Refresh();
            btnSubmit.Enabled = true;
            btnPre.Enabled = true;
            p1.X = 0;
        }
    }
}


private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    using (var p = new Pen(Color.Red, 5))
    {
        for (int x = 0; x < p1List.Count; x++)
        {
            e.Graphics.DrawLine(p, p1List[x], p2List[x]);
        }
    }
}
private void RemoveDot\u单击(对象发送者,事件参数e)
{
如果(dbldot.Images.Count!=0)
{
pictureBox1.Controls.RemoveAt(dbldot.Images.Count-1);
p1List.RemoveAt(p1List.Count-1);
p2List.RemoveAt(p2List.Count-1);
pictureBox1.Refresh();
}
}
私有void RemoveLine_单击(对象发送方,事件参数e)
{
if(p1List.Count!=0&&p2List.Count!=0)
{
p1List.RemoveAt(p1List.Count-1);
p2List.RemoveAt(p2List.Count-1);
pictureBox1.Refresh();
}
无效图片\u双击(对象发送器,事件参数e)
{
doubletime++;
PictureBox点=新PictureBox();
{
dot.Name=“reddot”;
点尺寸=新尺寸(16,16);
dot.Image=Resources.red\u dot\u 32;
dot.SizeMode=PictureBoxSizeMode.CenterImage;
点位置=新点(p2.X-7,p2.Y-7);
}
对于(int x=0;x

因此,最终有人可以帮助我找到一种正确的方法,在双击时添加dot.png。保留将dot.png放置在双击位置的功能,保留记录其位置和删除该dot.png的功能。可以使用单独的按钮,也可以使用删除行按钮。这听起来像是f特征爬行。也许值得你花点时间退一步,问问是否有办法重新设计你的程序,使动作设计更简单。我已经考虑过了。但我不确定是否有更简单的方法,但可能有不同的方法?我想如果有不同的方法,那就在于我如何添加和删除点。希望有人能帮上忙。首先,多态性将大大有助于简化设计。与其存储线和点的列表,不如存储一个列表