2次点击&双击在图片框上创建线条和点

时间:2017-02-01 12:57:11

标签: c# picturebox

我已经挣扎了好几天,一直担心寻求帮助,因为我担心我不会很好地解释它,而且看起来可能过于复杂。但是我已经达到了我不知道还能做什么的那一点。所以这里。

我有一个带图像的图片框。这最初开始于我只需要点击图像上的一个点,然后第二个点和两点之间绘制一条线。 p1和p2的列表包含(p1.X,p1.Y)和(p2.X,p2.Y)。 "区域"他们创建的这条线也会被记录,这取决于它们在哪里生成线的RGB值。

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

当他们要求创建一个特定尺寸的圆点时,他们会投入一些小扳手。所以我做了一个小的red dot.png图片。然后设置一个双击事件,这样当他们双击时,它会将dot.png添加到他们双击的位置的图片框中。在一个好方法中,因为创建线条是通过单击2个点创建的,所以这也有利于记录p1和p2位置以及单击的区域。所以我一石二鸟。

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

所以我想我会创建一个单独的删除按钮来清除最后创建的点。我不想这样做,我宁愿有1个按钮,但在这种情况下,我不知道这是怎么回事。

我试图创建一个点列表,然后将点添加到图片框中,但我一直遇到问题。删除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]);
        }
    }
}

所以最终有人可以帮助我找到一个正确的方法来在双击时添加dot.png。保留将dot.png放在双击位置的能力,保留记录其位置以及删除dot.png的能力。使用单独的按钮或最好在删除线按钮内。

0 个答案:

没有答案