2015-01-04 109 views
-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"); 


      } 
    } 

感谢您的任何帮助:)。

+0

让我们退一步:您首先尝试用表单设计器完成的任务。如果这样做,然后看看以编程方式进行。 – rene 2015-01-04 12:17:22

回答

0

可以在代码TextBox添加到PictureBox这样的:

TextBox newTextBox = new TextBox(); 
newTextBox.Parent = yourPictureBox; 
// place it e.g. to the left bottom: 
newTextBox.Location = new Point(10, yourPictureBox.Height - newTextBox.Height); 

注意,这将增加TextBoxControls集合PB的;所以它会坐在的顶部PictureBox;所以,是的,它会随着PictureBox移动,但它也会隐藏一部分或PB!

如果您只是想将它们分组,请将它们都添加到Panel之类的东西中,再次将它们设置为Parent

另请注意,您无法在设计器中执行此操作; PictureBox并非真正意味着作为Container ..

只要你有一个对它的引用,如何创建PictureBox并不重要。

+0

非常感谢,它帮助我:)。我还有一个问题。做一个隐藏/显示这个文本框(或所有文本框)的按钮是否可行?我可以做到这一点,当有一个文本框,我可以设置texbox.visible = false,但在动态文本框我不。谢谢 – Anonymous 2015-01-04 18:18:59

+0

是的,如果你有一个参考,改变'Visible'属性并不难。假设你只有一个控件添加到PictureBox中,你可以像这样切换它:'onePictureBox.Controls [0] .Visible = ..'其中'..'可以是'true','false'或'!onePictureBox.Controls [0] .Visible' - 所以把它们全部关掉,你可以做'foreach(PictureBox pb in pictureboxes)pb.Controls [0] .Visible = false;'.. – TaW 2015-01-04 18:40:27

+0

好吧,但是当我在private void button1_Click对象发件人,EventArgs e)我没有参考图片框或文本框。当我使用发件人到文本框时,会引发一些错误。 – Anonymous 2015-01-04 18:49:13