2015-07-22 2 views
1

Я пытаюсь, чтобы кнопка, при нажатии, создавала новый элемент управления изображением. Чтобы каждый раз, когда я нажимаю на него, он добавляет еще один новый элемент управления изображением. Эти кадры будут иметь те же функции, что и возможность перемещать их и рисовать на них. Но кнопка только делает один и не более после этого с помощью следующего кода. Что мне не хватает?Создание новых элементов управления формы в Visual Basic

Public Class Form1 
     Dim xpos As New Integer 
     Dim ypos As New Integer 
     Dim pos As New Point 
     Dim x As Integer 
     Dim y As Integer 
     Dim canvas As New PictureBox 
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

      Dim i As Integer = 0 
      i = i + 1 
      canvas.Name = "canvas" & i 
      canvas.BackColor = Color.White 
      canvas.BorderStyle = BorderStyle.FixedSingle 
      canvas.Image = Nothing 
      canvas.Height = TextBox1.Text 
      canvas.Width = TextBox2.Text 
      AddHandler canvas.MouseDown, AddressOf PictureBox1_MouseDown 
      AddHandler canvas.MouseMove, AddressOf PictureBox1_MouseMove 
      Controls.Add(canvas) 

     End Sub 
     Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
      xpos = Cursor.Position.X - canvas.Location.X 
      ypos = Cursor.Position.Y - canvas.Location.Y 
     End Sub 

     Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
      If e.Button = Windows.Forms.MouseButtons.Left Then 
       pos = MousePosition 
       pos.X = pos.X - xpos 
       pos.Y = pos.Y - ypos 
       canvas.Location = pos 
      End If 
     End Sub 

     Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 

     End Sub 

     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     End Sub 
    End Class 
+0

Попытайтесь положить 'Dim canvas As New PictureBox' внутри обработчика кнопок, чтобы каждый раз программа создавала новую переменную. На данный момент вы создаете только одно - при загрузке формы. – Eminem

+0

Я пробовал это. тогда обработчики событий мыши на панели изображений не распознают холст. – BuddyRoach

+0

'Dim i As Integer = 0 i = i + 1' Это всегда будет 1, чтобы ваше имя всегда было одинаковым. Вместе с предложением Eminemg это должно решить вашу проблему. Для доступа к холсту в mousemove используйте 'DirectCast (отправитель, PictureBox) .Location = pos' – Saragis

ответ

0

увеличение счетчика каждый раз, когда создается новый холст:

Public Class Form1 
    Dim counter As New Integer 
    ... 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     counter += 1 
     canvas.Name = "canvas" & counter.ToString() 
     ... 

Доступ холст, что мышь в настоящее время переносимую по:

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
     If e.Button = Windows.Forms.MouseButtons.Left Then 
      pos = MousePosition 
      pos.X = pos.X - xpos 
      pos.Y = pos.Y - ypos 
      DirectCast(sender, PictureBox).Location = pos 
     End If 
    End Sub 
+0

yup thats, как я это сделал. еще раз спасибо. – BuddyRoach

1
Dim canvas As New PictureBox 

У вас есть несколько ошибок в ваш код, но это самый серьезный. Синтаксис As New гарантирует, что вы всегда будете создавать объект PictureBox, но он будет только один объект. И, конечно, одна переменная не может отслеживать несколько ящиков с картинками.

Что вам нужно сделать, так это создать новый при каждом нажатии кнопки. Как правило, рекомендуется отслеживать созданные вами коробки изображений. Так правильный код выглядит следующим образом:

Dim canvases As New List(Of PictureBox) 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim canvas = New PictureBox 
     canvases.Add(canvas) 
     canvas.Name = "canvas" & canvases.Count.ToString() 
     '' etc... 
    End Sub 

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
     Dim canvas = DirectCast(sender, PictureBox) 
     xpos = Cursor.Position.X - canvas.Location.X 
     ypos = Cursor.Position.Y - canvas.Location.Y 
    End Sub 

Обратите внимание, как отправителя аргумент дает вам обратную ссылку на объект изображения коробки, который будучи наведение мышки. Сделайте то же самое в любых других обработчиках событий.

+0

ОК, я получил их в списке. как я их ссылаюсь? я должен иметь возможность изменять свои имена после их создания, изменять их размер, удалять их и т. д. Я сделал Dim canvas = DirectCast (отправитель, PictureBox) в событиях, которые я сделал, например, canvas.remove (canvas), но каждый раз, когда он отбрасывает эту ошибку: невозможно сбрасывать объект типа «System.Windows.Forms.Button», чтобы ввести «System.Windows.Forms.PictureBox». – BuddyRoach

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