2015-01-04 6 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

ответ

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); 

Обратите внимание, что это добавит TextBox к Controls коллекции ПБ; поэтому он будет сидеть сверху of PictureBox; поэтому, да, он будет двигаться с PictureBox, но он также скроет часть или PB!

Если вы просто хотите их сгруппировать, добавьте их как-то вроде Panel, снова установив это как их Parent!

Также обратите внимание, что вы не можете сделать это в Дизайнере; PictureBox не на самом деле имел в виду, чтобы выступать в качестве Container ..

Это не имеет значения, как PictureBox была создана, до тех пор, пока у вас есть ссылка на него.

+0

Большое спасибо, мне это помогает :). У меня есть еще один вопрос. Можно ли сделать кнопку, которая скрывает/показывает это текстовое поле (или все текстовые поля)? Я могу сделать это, когда есть один текстовый ящик, где я могу установить texbox.visible = false, но в динамических текстовых окнах я не делаю. Спасибо – Anonymous

+0

Да, изменение свойства 'Visible' не сложно, если у вас есть ссылка. Предполагая, что вы добавили только один элемент управления в PictureBox, вы можете переключать его следующим образом: 'onePictureBox.Controls [0] .Visible = ..' где '..' может быть' true', 'false' или'! OnePictureBox.Controls [0] .Visible'. Поэтому, чтобы отключить их, вы можете сделать «foreach» (PictureBox pb в картинных ящиках). Pb.Controls [0] .Visible = false; '.. – TaW

+0

Хорошо, но когда я нахожусь в закрытом void button1_Click (объект отправителя, EventArgs e) У меня нет ссылки на изображение или текстовое поле. Когда я использую отправителя в текстовое поле, он вызывает некоторую ошибку. – Anonymous

Смежные вопросы