2014-12-25 1 views
0

сначала извините за мой английский. Я программирую приложение в виде окон. Это что-то вроде Packet Tracer. У меня четыре кнопки. Когда я нажимаю на них, они динамически создают графические ящики с изображением маршрутизатора или коммутатора ... Каждый раз, когда я нажимаю на кнопку, создается новый ящик (Switch или Router, ...). Я также могу перемещаться с помощью этих изображений с помощью мыши. Мне нужно создать кнопку, которая соединяет выбранные кадры с линией (Кабель). Эти изображения должны быть выбраны щелчком по ним. Он может перемещаться с помощью этих объектов (подвижная линия). Вот мой код:Как подключить фотокамеру с соединительной линией

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 

    public partial class Form1 : Form 
    { 
     int a = 0; 
     int b = 0; 
     int c = 0; 
     int d = 0; 

     PictureBox[] picturebox = new PictureBox[100]; 



     public Form1() 
     { 

      InitializeComponent(); 

     } 


     private void router_Click(object sender, EventArgs e) 
     { 


      ++a; 

      picturebox[a] = new PictureBox(); 
      picturebox[a].Name = "picturebox" + a; 
      picturebox[a].Location = new Point(0 + (a-1) *100,100); 
      picturebox[a].Size = new Size(70, 70); 
      picturebox[a].BorderStyle = BorderStyle.None; 
      picturebox[a].SizeMode = PictureBoxSizeMode.StretchImage; 
      this.Controls.Add(picturebox[a]); 


      picturebox[a].Image = Image.FromFile(@"D:\\router.jpg"); 
      picturebox[a].Refresh(); 
      picturebox[a].MouseDown += new MouseEventHandler(picMouseDown); 
      picturebox[a].MouseMove += new MouseEventHandler(picMouseMove); 
      picturebox[a].MouseUp += new MouseEventHandler(picMouseUp); 




     } 


     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     int x = 0; 
     int y = 0; 
     bool drag = false; 

     private void picMouseDown(object sender, MouseEventArgs e) 
     { 
      // Get original position of cursor on mousedown 
      x = e.X; 
      y = e.Y; 
      drag = true; 
     } 

     private void picMouseMove(object sender, MouseEventArgs e) 
     { 
      if (drag) 
      { 
       PictureBox pb = (PictureBox)sender; 
       // Get new position of picture 
       pb.Top += e.Y - y; 
       pb.Left += e.X - x; 
       pb.BringToFront(); 
      } 
     } 

     private void picMouseUp(object sender, MouseEventArgs e) 
     { 
      drag = false; 
     } 

     private void switch1_Click(object sender, EventArgs e) 
     { 
      ++b; 
      picturebox[b] = new PictureBox(); 
      picturebox[b].Name = "picturebox" + b; 
      picturebox[b].Location = new Point(0 + (b - 1) * 100, 180); 
      picturebox[b].Size = new Size(70, 70); 
      picturebox[b].BorderStyle = BorderStyle.None; 
      picturebox[b].SizeMode = PictureBoxSizeMode.StretchImage; 
      this.Controls.Add(picturebox[b]); 


      picturebox[b].Image = Image.FromFile(@"D:\HP ProBook 450\Desktop\Grafika\switch1.png"); 
      picturebox[b].Refresh(); 
      picturebox[b].MouseDown += new MouseEventHandler(picMouseDown); 
      picturebox[b].MouseMove += new MouseEventHandler(picMouseMove); 
      picturebox[b].MouseUp += new MouseEventHandler(picMouseUp); 



     } 

     private void panel1_Paint(object sender, PaintEventArgs e) 
     { 

     } 

     private void pc_Click(object sender, EventArgs e) 
     { 
      ++c; 

      picturebox[c] = new PictureBox(); 
      picturebox[c].Name = "picturebox" + c; 
      picturebox[c].Location = new Point(0 + (c - 1) * 100, 260); 
      picturebox[c].Size = new Size(70, 70); 
      picturebox[c].BorderStyle = BorderStyle.None; 
      picturebox[c].SizeMode = PictureBoxSizeMode.StretchImage; 
      this.Controls.Add(picturebox[c]); 


      picturebox[c].Image = Image.FromFile(@"D:\HP ProBook 450\Desktop\pc.jpg"); 
      picturebox[c].Refresh(); 
      picturebox[c].MouseDown += new MouseEventHandler(picMouseDown); 
      picturebox[c].MouseMove += new MouseEventHandler(picMouseMove); 
      picturebox[c].MouseUp += new MouseEventHandler(picMouseUp); 

     } 

     private void server_Click(object sender, EventArgs e) 
     { 
      ++d; 

      picturebox[d] = new PictureBox(); 
      picturebox[d].Name = "picturebox" + d; 
      picturebox[d].Location = new Point(0 + (d - 1) * 100, 340); 
      picturebox[d].Size = new Size(70, 70); 
      picturebox[d].BorderStyle = BorderStyle.None; 
      picturebox[d].SizeMode = PictureBoxSizeMode.StretchImage; 
      this.Controls.Add(picturebox[d]); 


      picturebox[d].Image = Image.FromFile(@"D:\HP ProBook 450\Desktop\server.png"); 
      picturebox[d].Refresh(); 
      picturebox[d].MouseDown += new MouseEventHandler(picMouseDown); 
      picturebox[d].MouseMove += new MouseEventHandler(picMouseMove); 
      picturebox[d].MouseUp += new MouseEventHandler(picMouseUp); 

     } 




    } 
} 

Спасибо за помощь.

ответ

1

Вы должны аннулировать родителю при добавлении PictureBox или при перемещении PictureBox: (picMouseMove и 4 раза в click обработчиков, было бы лучше использовать 1 функцию)

Invalidate(); 

Этот является примером OnPaint, рисовая линии между изображениями, поскольку они расположены в коллекции Controls: (ваш массив изображений кажется очень странным, вы всегда добавляете элементы управления в индекс 1, всегда перезаписывая предыдущую запись? Я бы предложил использовать List if вам необходимо оставить ссылку на них)

protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     var pictureBoxes = Controls.OfType<PictureBox>().ToArray(); 
     if (pictureBoxes.Length > 1) 
     { 
      for (int i = 1; i < pictureBoxes.Length; i++) 
      { 
       DrawLineBetween(e.Graphics, pictureBoxes[i - 1], pictureBoxes[i]); 
      } 
     } 
    } 

Эта функция может быть использована, чтобы нарисовать линию между 2 коробках:

private void DrawLineBetween(Graphics g, PictureBox from, PictureBox to) 
    { 
     g.DrawLine(Pens.Black, 
      new Point(from.Left + from.Width/2, from.Top + from.Height/2), 
      new Point(to.Left + to.Width/2, to.Top + to.Height/2)); 
    } 

----- полный образец ниже -----

Я реструктурировать свой полный пример, и добавлен код выше, чтобы начать с рабочего примера:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 

    public partial class Form1 : Form 
    { 
     List<PictureBox> pictureboxes = new List<PictureBox>(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void AddPictureBox(string imagePath) 
     { 
      var pb = new PictureBox(); 
      pb.Name = "picturebox" + pictureboxes.Count; 
      pb.Location = new Point(pictureboxes.Count * 100, 100); 
      pb.Size = new Size(70, 70); 
      pb.BorderStyle = BorderStyle.None; 
      pb.SizeMode = PictureBoxSizeMode.StretchImage; 
      this.Controls.Add(pb); 

      pb.Image = Image.FromFile(imagePath); 
      pb.Refresh(); 
      pb.MouseDown += new MouseEventHandler(picMouseDown); 
      pb.MouseMove += new MouseEventHandler(picMouseMove); 
      pb.MouseUp += new MouseEventHandler(picMouseUp); 

      pictureboxes.Add(pb); 

      Invalidate(); 
     } 

     private void router_Click(object sender, EventArgs e) 
     { 
      AddPictureBox(@"D:\\router.jpg"); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     int x = 0; 
     int y = 0; 
     bool drag = false; 

     private void picMouseDown(object sender, MouseEventArgs e) 
     { 
      // Get original position of cursor on mousedown 
      x = e.X; 
      y = e.Y; 
      drag = true; 
     } 

     private void picMouseMove(object sender, MouseEventArgs e) 
     { 
      if (drag) 
      { 
       PictureBox pb = (PictureBox)sender; 
       // Get new position of picture 
       pb.Top += e.Y - y; 
       pb.Left += e.X - x; 
       pb.BringToFront(); 

       Invalidate(); 
      } 
     } 

     private void picMouseUp(object sender, MouseEventArgs e) 
     { 
      drag = false; 
     } 

     private void switch1_Click(object sender, EventArgs e) 
     { 
      AddPictureBox(@"D:\HP ProBook 450\Desktop\Grafika\switch1.png"); 
     } 

     private void panel1_Paint(object sender, PaintEventArgs e) 
     { 

     } 

     private void pc_Click(object sender, EventArgs e) 
     { 
      AddPictureBox(@"D:\HP ProBook 450\Desktop\pc.jpg"); 
     } 

     private void server_Click(object sender, EventArgs e) 
     { 
      AddPictureBox(@"D:\HP ProBook 450\Desktop\server.png"); 
     } 


     protected override void OnPaint(PaintEventArgs e) 
     { 
      base.OnPaint(e); 

      if (pictureboxes.Count > 1) 
      { 
       var arr = pictureboxes.ToArray(); 
       for (int i = 1; i < arr.Length; i++) 
       { 
        DrawLineBetween(e.Graphics, arr[i - 1], arr[i]); 
       } 
      } 
     } 

     private void DrawLineBetween(Graphics g, PictureBox from, PictureBox to) 
     { 
      g.DrawLine(Pens.Black, 
       new Point(from.Left + from.Width/2, from.Top + from.Height/2), 
       new Point(to.Left + to.Width/2, to.Top + to.Height/2)); 
     } 

    } 
} 
+0

Большое спасибо. Но мне нужно создать новую кнопку (линию), на которую я нажимаю, я могу подключиться к строке любых изображений, которые я хочу. – Anonymous