使用按钮作为PictureBox上的坐标绘制一条线

时间:2016-01-25 14:57:59

标签: c# winforms coordinates picturebox

目前,我正在根据显示的图像为客房/办公室制作搜索程序。

enter image description here

我在程序上遇到麻烦,我希望在2D地图上显示一条线,其中按钮将用于连接线的每个坐标。但搜索房间后没有会出现的线条。

private void button2_Click(object sender, EventArgs e)
    {
        System.Drawing.Pen myPen;
        myPen = new System.Drawing.Pen(System.Drawing.Color.Red, 5);
        System.Drawing.Graphics frmGraphics = pictureBox1.CreateGraphics();

        if (textBox1.Text == "")
        {
            MessageBox.Show("Nothing to Search!", "", MessageBoxButtons.OK);
        }
        else
        {
            if (radioButton2.Checked == true)
            {

                if(textBox1.Text == "dental clinic")
                {


                    frmGraphics.DrawLine(myPen, path1.Location.X, path1.Location.Y, path2.Location.X, path2.Location.Y);
                    Thread.Sleep(500);
                    frmGraphics.DrawLine(myPen, path2.Location.X, path2.Location.Y, path3.Location.X, path3.Location.Y);
                    Thread.Sleep(500);
                    frmGraphics.DrawLine(myPen, path3.Location.X, path3.Location.Y, path4.Location.X, path4.Location.Y);


                    lbres.Text = "Dental Clinic";
                    lbloc.Text = "OutPatient Department";
                    OPDView opdfrm = new OPDView();
                    dview = opdfrm;
                }
                else
                {
                    MessageBox.Show("No Results Found!", "", MessageBoxButtons.OK);
                }
                myPen.Dispose();
                frmGraphics.Dispose(); 
                return;

          }
       }

我有4个按钮,它们已经重命名为path1 - path4,并希望将它们全部连接在一起。我需要一些帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

代码有更多问题,但我最后只会暗示它们。

你可能绊倒的错误是没有正确的坐标。

PictureBox不是容器控件,所以无论你在顶部上放置什么 里面。通过移动PB进行测试:Buttons 不会移动 ... - 请注意,这与将Button放到Panel不同或GroupBox ..

有两种方法可以解决它:

  • 您可以在代码或
  • 中生成Buttons的{​​{1}}个孩子
  • 您可以计算出正确的位置。

以下是如何制作PB的Button子项:

PictureBox

请注意,您必须采用现在按下按钮的代码

或者您更正了考虑PB位置的位置:

path1.Parent = pictureBox1;    
path2.Parent = pictureBox1;    
path3.Parent = pictureBox1;

另一个问题是使用Point np1 = Point.Subtract(path1.Location, (Size)pictureBox1.Location); Point np2 = Point.Subtract(path2.Location, (Size)pictureBox1.Location); Point np3 = Point.Subtract(path3.Location, (Size)pictureBox1.Location); frmGraphics.DrawLine(myPen, Point.Empty, np1 , np2); ... 绘制的方式并不持久。事实上它几乎总是错的!结果将在每个窗口调整大小等时消失。更好的方法是使用control.CreateGraphics参数绘制Picturebox.Paint事件。

我也想知道e.Graphics首先是什么?您可以创建Buttons并在没有它们的情况下进行绘制。

同样使用List<Point>动画将冻结UI线程。而是使用Thread.Sleep(500)来查看点列表。你需要固定数量的动画制作方法,你可以创建一个Timer来保存它们。

<强>更新

创建点列表很简单。在课堂级别声明它:

Dictionary<string, List<Point>>

当你知道数据时填写它:

List<Point> way = new List<Point>();

还创建一个Timer并设置其Interval。在其Tick事件中,您向上移动指向当前段的指针,并调用Paint事件使PictureBox无效:

way.Add(new Point(100, 100));
way.Add(new Point(150, 100));
way.Add(new Point(150, 200));
way.Add(new Point(10, 200));
way.Add(new Point(10, 220));
way.Add(new Point(50, 220));
way.Add(new Point(50, 250));

在PictureBox的Paint事件中,您绘制从开始到当前索引的路径:

void aTimer_Tick(object sender, EventArgs e)
{
    point = Math.Min(point + 1, way.Count);
    pictureBox1.Invalidate();
    if (point >= way.Count) aTimer.Stop();
}

我省略了一些检查,你会想到一种存储或构建点列表的方法..

您还可能希望通过绘制较小的片段来改进动画。为此您可以添加更多点,但使用函数将更灵活..:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    using (Pen pen = new Pen(Color.DarkGoldenrod, 2.5f))
        for (int i = 1; i < point; i++) e.Graphics.DrawLine(pen , way[i - 1], way[i]);
}

enter image description here